Android 11 代码如何实现 当读卡器读取手机nfc时uid不变
时间: 2023-09-28 22:13:41 浏览: 51
在 Android 11 中,可以使用 `NfcAdapter#enableReaderMode` 方法来启用应用程序的 NFC 读卡器模式。在这种模式下,当设备读取到支持 NFC 技术的标签时,应用程序将会接收到回调事件,可以在回调事件中访问标签上的数据。
要实现当读卡器读取手机 NFC 时 UID 不变,可以在回调事件中使用 `IsoDep` 类来和标签进行通信。在与标签进行通信时,可以使用 `IsoDep#getHistoricalBytes` 方法来获取标签的历史字节,从而获得 UID 信息。
以下是一个示例代码:
```java
public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback {
private NfcAdapter nfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
}
@Override
protected void onResume() {
super.onResume();
enableReaderMode();
}
@Override
protected void onPause() {
super.onPause();
disableReaderMode();
}
private void enableReaderMode() {
Bundle options = new Bundle();
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 5000);
nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, options);
}
private void disableReaderMode() {
nfcAdapter.disableReaderMode(this);
}
@Override
public void onTagDiscovered(Tag tag) {
IsoDep isoDep = IsoDep.get(tag);
try {
isoDep.connect();
byte[] historicalBytes = isoDep.getHistoricalBytes();
if (historicalBytes != null) {
String uid = bytesToHex(Arrays.copyOfRange(historicalBytes, 2, 10));
Log.d("MainActivity", "UID: " + uid);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
isoDep.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte aByte : bytes) {
sb.append(String.format("%02X", aByte));
}
return sb.toString();
}
}
```
在上述代码中,我们首先在 `onResume` 方法中启用了 NFC 读卡器模式,并在 `onPause` 方法中禁用了该模式。在 `onTagDiscovered` 方法中,我们使用 `IsoDep` 类与标签进行通信,并在回调事件中获取标签的历史字节。最后,我们从历史字节中提取 UID 信息,并打印到日志中。