首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取Android标记时出现连接错误

读取Android标记时出现连接错误
EN

Stack Overflow用户
提问于 2018-02-22 11:18:36
回答 2查看 2.3K关注 0票数 8

我有一个应用程序,可以读取各种类型的NFC标记。多年来,它一直运行良好,但在较新的安卓设备上,当扫描特定类型的标记时,会始终抛出java.io.IOException。这个标签支持Mifare经典版和ISO,但是我们专门使用IsoDep技术进行连接。

NFC TagInfoNXP的NFC TagInfo应用程序也都无法读取标签而不会出错。

能工作的设备:

  • Moto X Play (Android 6.0.1)
  • Moto G Play (Android 6.0.1)
  • 三星Galaxy S7 (Android7.0)
  • 三星Galaxy S8 - UK型号(Android7.0)
  • 像素2 (Android 8.1)

发生故障的设备:

  • Moto G5S (Android7.1.1)
  • Moto Z2 Play (Android7.1.1)
  • Moto E4 Plus (Android7.1.1)
  • 华为荣誉8 (Android 7.0)
  • LG K8 (Android7.0)
  • LG K10 (Android7.0)
  • 三星Galaxy S8 -美国款(Android7.0)

复制问题所需的代码非常简单。

NFC意图是通过前景分配接收的,然后在它自己的线程中运行以下内容(其间没有其他线程或与NFC相关的处理):

代码语言:javascript
运行
复制
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.NfcA

最后,对于无法工作的设备,logcat中将出现以下条目:E/NxpNfcJni: Mifare Classic detected

随着更现代的Android设备所提供的扩展NFC支持,NFC系统服务中是否会出现一些关于要连接到什么TagTechnology的混淆?

EN

回答 2

Stack Overflow用户

发布于 2019-11-12 01:55:16

当在Android 8+与Android 6,7上进行测试时,我在8+类中看到了类似的问题。

对我来说,关键是使用NfcAdapter.enableReaderMode实例方法关闭Android设备上的主机卡仿真,而我的应用程序处于前台并试图读取/写入标记。

然后,我没有像文档示例那样应用生命周期回调,而是按照这个问题中提到的建议执行以下操作;

代码语言:javascript
运行
复制
@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);
}
票数 0
EN

Stack Overflow用户

发布于 2021-05-12 12:00:57

当标记支持多个技术条目时,可以使用基本标记技术api - tag.getTechList( )独立地访问每个条目;

按以下方式修改代码:

代码语言:javascript
运行
复制
    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标签技术。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48926137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档