2

我有一个读取 NFC 标签的 Android 应用程序。在 LG Nexus 4 上一切正常,但在三星 Galaxy S5 上我只得到 I/O 异常(在多部手机上测试)。

因此,标签的类型为 NfcV,并且在调用 NfcV 时出现 I/O 异常connect()(进一步向下是错误代码 -5 ERROR_CONNECT)。

NXP 的 NFC TagInfoconnect()可以读取 SG5S 上标签的内存内容 - 除了使用和之外,还有其他读取 NfcV 标签的方法transceive()吗?

NFC 芯片之间的哪些差异会导致我的应用在一部手机上连接失败,但在另一部手机上却没有(而其他应用读取它正常)?我可能需要调整超时吗?

代码片段:

NfcV nfcvTag = NfcV.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
if(nfcvTag!=null){
    try {
        nfcvTag.connect();
        //{flags:0x00, read multiple blocks command: 0x23, start at block 0: 0x00, read 9 blocks (0 to 8): 0x08}
        response = nfcvTag.transceive(new byte[] {(byte)0x00,(byte)0x23,(byte)0x00,byte)0x08});
    } catch (IOException e) {
        Log.d("NFCService", nfcvTag.toString());
    } finally {
        try {
            nfcvTag.close();
        } catch (IOException e) {
        }
    }
}
4

1 回答 1

1

因此,总结一下我们在上述评论中的讨论中发现的内容:

您似乎无法IntentService在单独的线程中使用 an 来处理对 NFC 标签的访问(通过收到的 NFC 发现意图)。在这种情况下,标签技术对象的connect()方法将失败。

这并不意味着您不能在单独的(工作)线程中处理对标签的访问。事实上,您不应访问主 (UI) 线程上的标签,因为这将在标签访问期间阻塞应用程序(及其 UI),并可能导致您的应用程序因无响应而被系统杀死。手动生成一个处理对标签的访问的工作线程就可以了。

我个人和未经证实的想法/疯狂猜测为什么IntentService无法处理标签:

  1. 将 NFC 发现意图传递给标签可能会IntentService在标签发现和对标签的实际访问之间引入显着延迟。在此延迟期间,与标签的通信可能会中断(例如,由于用户未对准阅读器和标签天线导致无法通信等)
  2. (我对 Android NFC 系统服务的内部没有足够的了解,不知道这是否可能:)可能是该Tag对象以某种方式绑定到Activity. 由于IntentService是不同的组件(尽管在相同的应用程序上下文中执行),因此可能不允许访问该Tag对象。

Galaxy S5 中使用的 NFC 控制器似乎只支持已寻址的 ISO/IEC 15693 READ 命令。使用未寻址的命令(即未设置寻址标志且不包含标签的 UID 的命令)会导致{ 0x02 }transceive()方法返回。

很难说这是否通常是 S5 中的 NFC 控制器(来自 NXP 的 PN547)的情况,或者这是否特定于标签如何处理已寻址和未寻址的命令和响应。

于 2014-06-11T16:00:38.727 回答