我有一个应用程序可以读取各种类型的 NFC 标签。多年来它运行良好,但对于较新的 Android 设备,java.io.IOException
扫描特定类型的标签时始终抛出。有问题的标签同时支持 Mifare Classic 和 ISO-DEP,但我们使用 IsoDep
进行连接具体技术。
NFC TagInfo或 NFC TagInfo by NXP应用程序也能够正确读取标签。
工作设备:
失败的设备:
重现问题所需的代码非常简单。
通过前台调度接收 NFC Intent ,然后在其自己的线程中运行以下内容(中间没有其他线程或 NFC 相关处理):
IsoDep isoDep = IsoDep.get(tag);
try {
isoDep.connect();
}
catch (IOException e) {
Log.e("NFC", ":(");
}
当
IOException
被 connect()
抛出android.nfc.tech.BasicTagTechnology
中的方法, errorCode
为 -5 (ERROR_CONNECT)。有趣的是,对于可以工作的设备,
Tag
公开的技术列表如下: android.nfc.tech.IsoDep, android.nfc.tech.NfcA 对于不工作的设备,技术列表要长得多,并且包含重复项: android.nfc.tech.IsoDep, android.nfc.tech.NfcA, android.nfc.tech.NfcA, android.nfc.tech.MifareClassic, android.nfc.tech.NdefFormattable
最后,对于不工作的设备,logcat 中会出现以下条目:
E/NxpNfcJni: Mifare Classic detected
是否有可能随着更现代的 Android 设备提供的扩展 NFC 支持在 NFC 系统服务中存在一些关于连接什么 TagTechnology 的混淆?
最佳答案
在 Android 8+ vs 上进行测试时,我看到了 IsoDep 类的类似问题
安卓 6,7
对我来说,关键是使用 NfcAdapter.enableReaderMode当我的应用程序处于前台并尝试读取/写入标签时,关闭 Android 设备上的主机卡仿真的实例方法。
然后不是应用生命周期回调,如图所示 Documentation Example ,我遵循了此 Question 的建议并做了以下事情;
@Override
public void onPause() {
super.onPause();
NfcAdapter.getDefaultAdapter(this).disableReaderMode(this);
}
@Override
public void onResume() {
super.onResume();
Bundle options = new Bundle();
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 500);
adapter.enableReaderMode(
this,
new NfcAdapter.ReaderCallback() {
@Override
public void onTagDiscovered(final Tag tag) {
IsoDep isoDep = IsoDep.get(tag);
// Connect and perform rest of communication
}
},
NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
options
);
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
关于java - 读取 Android NFC IsoDep 标签时出现连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926137/