我有一个Android应用程序,可以读取NFC标签。在LG Nexus 4上一切正常,但在三星Galaxy S5上我只能获得I / O异常(在多部手机上测试)。
因此,标签的类型为NfcV,在NfcV上调用connect()
时会出现I / O异常(更进一步的是错误代码-5 ERROR_CONNECT)。
NFC TagInfo by NXP可以读取SG5S上标记的内存内容 - 是否还有其他方法可以读取NfcV标记而不是connect()
和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) {
}
}
}
答案 0 :(得分:1)
因此,总结一下我们在上述评论的讨论中发现的内容:
您似乎无法使用
IntentService
在单独的线程中处理对NFC标记的访问(通过收到的NFC发现意图)。在这种情况下,标记技术对象的connect()
方法将失败。
这并不意味着您无法处理对单独(工作)线程中的标记的访问。实际上,您应该不访问主(UI)线程上的标记,因为这会在标记访问期间阻止应用(及其UI),并可能导致您的应用被杀死系统没有反应。手动生成处理标记访问的工作线程可以正常工作。
我的个人和未经证实的想法/猜测为什么IntentService
无法处理标记:
IntentService
会在标签发现和对标签的实际访问之间引入显着延迟。在此延迟期间,与标签的通信可能已经下降(例如,由于用户未对准读卡器和标签天线使通信无法进行等)Tag
对象以某种方式绑定到Activity
。由于IntentService
是一个不同的组件(虽然在同一个应用程序上下文中执行),但可能不允许访问Tag
对象。似乎Galaxy S5中使用的NFC控制器仅支持已寻址的ISO / IEC 15693 READ命令。使用未解决的命令(即没有设置已设置标记的命令且不包含标记的UID)会导致从
{ 0x02 }
方法返回transceive()
。
很难说在S5中NFC控制器(来自NXP的PN547?)是否通常是这种情况,或者这是否特定于标签如何处理寻址与未解决的命令和响应。