当我在 ACR122U 上模拟卡时,我的 Galaxy 5 出现奇怪的行为。
我认为问题发生在我运行 Android 更新时。当应用程序不在前台时,我的 Intent 过滤器不再捕获标签,因为模拟标签被视为 JIS 6319-4
而不是 ISO/IEC 14443-4
标签。
当应用程序不在前台或 在前台并在 foregroundDispatch
中运行时我得到的序列:
TgInitAsTarget
> FF 00 00 00 27 D4 8C 04 04 00 01 23 45 20 000000000000000000000000000000000000000000000000000000000000
< D5 8D 08 E0 80 90 00
TgGetData
> FF 00 00 00 02 D4 86
Target has been released error
< D5 87 29 90 00
我循环了 5 次,但是 TgInitAsTarget
都不起作用。当我使用 enableReaderMode
(不跳过 NDEF)时,我得到正确的序列:
...
> FF 00 00 00 02 D4 86 //TgGetData
< D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 01 00 9000 //SELECT command
> FF 00 00 00 05 D4 8E 02 6A 82 //file or application not found
< D5 8F 00 90 00 //Ack
> FF 00 00 00 02 D4 86 //TgGetData
< D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 00 90 00 //SELECT command
> FF 00 00 00 05 D4 8E 02 6A 82 //file or application not found
< D5 8F 00 90 00 //Ack
> FF 00 00 00 02 D4 86 //TgGetData
< D5 87 00 00 A4 04 00 07 D2 76 00 00 85 01 00 90 00 //SELECT command
> FF 00 00 00 05 D4 8E 02 6A 82 //file or application not found
< D5 8F 00 90 00 //Ack
TgGetData
> FF 00 00 00 02 D4 86
//Recieving data
问题一
为什么当应用程序不在前台或使用 enableForegroundDispatch
时,Android 不返回任何内容?这很奇怪,因为它一直在工作,但看起来更新改变了 NFC 的行为。
问题二
enableReaderMode
(无 NDEF 跳过)的行为与 enableForegroundDispatch
的行为不同是否正常?
请注意,使用以下命令启用读者模式:
nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null);
最佳答案
关于 ACR122U 在主机卡仿真模式下被检测为 FeliCa (JIS X 6319-4) 而不是 ISO-DEP (ISO/IEC 14443-4):
这似乎是 PN532 NFC Controller 的一个已知问题。到目前为止,我没有找到任何解决方案。这与您已经在 this question of yours 中发现的问题相同.
关于问题 1:当应用程序不在前台或启用了 enableForegroundDispatch 时,为什么 Android 不返回任何内容?
好吧,正如您已经发现的那样,Android 设备显示它检测到模拟卡为 FeliCa。然而,对 tgInitAsTarget 命令的响应 (D5 8D 08 E0 80 90 00
) 表明 PN532 已被激活为 ISO-DEP。因此,似乎 Android 设备启动了与模拟 ISO-DEP 卡的通信,但必须立即放弃它而没有发送命令帧(因此您收到错误以响应 tgGetData 命令)。相反,Android 设备必须检测到(并可能与之通信)模拟的 FeliCa(实际上是 NFCIP-1)卡(这与我回答的第一部分中的问题有关)。
因为这之前是有效的,所以更新一定对您的 Android 设备的轮询/对等发现算法进行了一些更改。
关于问题 2:enableReaderMode(不带 NDEF skip)的行为与 enableForegroundDispatch 的行为不同是否正常?
这取决于您认为什么是“正常行为”。当您使用命令启用 Android 的阅读器模式时
nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null);
您明确指示 Android 的行为不同于默认标签/对等发现机制(与 enableForegroundDispatch
和普通标签分发系统一起使用)。
默认轮询将尝试发现所有不同的标签技术(NfcA、NfcB、NfcF(快)、NfcF(慢)、NfcV(可能有多种模式)、NFCIP-1 主动模式、NfcBarcode;通常不按此顺序), 因此它可以在FeliCa/NFC-DEP模式下发现ACR122U。
使用 enableReaderMode
命令,您明确指示 Android 仅轮询 NfcA。因此,您的设备将在 ISO-DEP 模式下正确激活 ACR122U,并因此启动 NDEF 发现程序。
关于Android 4.4.2 在没有 enableReaderMode 的情况下不接收 SELECT 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26237196/