我有一个读取各种类型NFC标签的应用程序。多年来一直都很正常,但是在较新的Android设备上扫描特定类型的标签时会始终抛出java.io.IOException
异常。这个标签支持Mifare Classic和ISO-DEP,但我们是使用IsoDep
技术进行连接。
NFC TagInfo和NFC TagInfo by NXP 应用程序也无法无错地读取此标签。
可用设备:
- Moto X Play(Android 6.0.1)
- Moto G Play(Android 6.0.1)
- Samsung Galaxy S7(Android 7.0)
- Samsung Galaxy S8 - 英国版(Android 7.0)
- Pixel 2(Android 8.1)
不可用设备:
- Moto G5S(Android 7.1.1)
- Moto Z2 Play(Android 7.1.1)
- Moto E4 Plus(Android 7.1.1)
- Huawei Honor 8(Android 7.0)
- LG K8(Android 7.0)
- LG K10(Android 7.0)
- Samsung Galaxy S8 - 美国版(Android 7.0)
需要重现问题的代码非常简单。
NFC意图通过前台调度接收,然后在自己的线程中运行以下内容(没有其他线程或NFC相关处理):
IsoDep isoDep = IsoDep.get(tag);
try {
isoDep.connect();
}
catch (IOException e) {
Log.e("NFC", ":(");
}
当
android.nfc.tech.BasicTagTechnology
中的connect()
方法抛出IOException
时,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?