java - 读取 Android NFC IsoDep 标签时出现连接错误

标签 java android nfc

我有一个应用程序可以读取各种类型的 NFC 标签。多年来它运行良好,但对于较新的 Android 设备,java.io.IOException扫描特定类型的标签时始终抛出。有问题的标签同时支持 Mifare Classic 和 ISO-DEP,但我们使用 IsoDep 进行连接具体技术。

NFC TagInfoNFC TagInfo by NXP应用程序也能够正确读取标签。

工作设备:

  • Moto X Play (Android 6.0.1)
  • Moto G Play (Android 6.0.1)
  • 三星 Galaxy S7 (Android 7.0)
  • 三星 Galaxy S8 - 英国型号 (Android 7.0)
  • 像素 2 (Android 8.1)

  • 失败的设备:
  • 摩托 G5S (Android 7.1.1)
  • Moto Z2 Play (Android 7.1.1)
  • Moto E4 Plus (Android 7.1.1)
  • 华为荣耀8(安卓7.0)
  • LG K8 (Android 7.0)
  • LG K10 (Android 7.0)
  • 三星 Galaxy S8 - 美国型号 (Android 7.0)


  • 重现问题所需的代码非常简单。

    通过前台调度接收 NFC Intent ,然后在其自己的线程中运行以下内容(中间没有其他线程或 NFC 相关处理):
    IsoDep isoDep = IsoDep.get(tag);
    
    try {
        isoDep.connect();
    }
    catch (IOException e) {
        Log.e("NFC", ":(");
    }
    

    IOExceptionconnect() 抛出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/

    相关文章:

    java - Hadoop 作业制定,将 ArrayList<String> 传递给 Mapper()

    java - 模型- View - Controller 和 Java

    Android:无法解析方法 'findFirstVisibleItemPosition()'?

    android - Robolectric:ShadowApplication?

    android - 如何将短信插入android上的已发送文件夹

    android - 在没有外部存储的情况下,如何使用 NFC 传输文件?

    java - Android 应用程序不合理地旋转为横向,然后又返回纵向

    java - Arduino 循环中断

    android - 只需读取 NFC 标签

    Android NFC卡仿真可行性