我有一个应用程序,可以读取各种类型的NFC标记。多年来,它一直运行良好,但在较新的安卓设备上,当扫描特定类型的标记时,会始终抛出java.io.IOException
。这个标签支持Mifare经典版和ISO,但是我们专门使用IsoDep
技术进行连接。
NFC TagInfo或NXP的NFC TagInfo应用程序也都无法读取标签而不会出错。
能工作的设备:
发生故障的设备:
复制问题所需的代码非常简单。
NFC意图是通过前景分配接收的,然后在它自己的线程中运行以下内容(其间没有其他线程或与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.NfcA
最后,对于无法工作的设备,logcat中将出现以下条目:E/NxpNfcJni: Mifare Classic detected
随着更现代的Android设备所提供的扩展NFC支持,NFC系统服务中是否会出现一些关于要连接到什么TagTechnology的混淆?
发布于 2019-11-12 01:55:16
当在Android 8+与Android 6,7上进行测试时,我在8+类中看到了类似的问题。
对我来说,关键是使用NfcAdapter.enableReaderMode实例方法关闭Android设备上的主机卡仿真,而我的应用程序处于前台并试图读取/写入标记。
然后,我没有像文档示例那样应用生命周期回调,而是按照这个问题中提到的建议执行以下操作;
@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);
}
发布于 2021-05-12 12:00:57
当标记支持多个技术条目时,可以使用基本标记技术api - tag.getTechList( )独立地访问每个条目;
按以下方式修改代码:
techList = tag.getTechList();
for (String tech : techList) {
if (tech.equals("android.nfc.tech.IsoDep"))
{
Log.i(TAG, "Tag Tech ISO DEP Found: " + tech );
IsoDep isoDep = IsoDep.get(tag);
try
{
isoDep.connect();
}
catch (IOException e)
{
Log.e("NFC", ":(");
}
}
}
并不是所有的设备都支持MifareClassic标签技术。
https://stackoverflow.com/questions/48926137
复制相似问题