Android 4.4.2 在没有 enableReaderMode 的情况下不接收 SELECT 容器

标签 android nfc galaxy hce acr122

当我在 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/

相关文章:

java - 在 Oreo 及更高版本中使用 WorkManager 时是否应该显示持续通知?

java - Android:将 NDEF 记录有效负载从字节转换为 int

android - 批量删除 Android 中的默认应用程序(使用终端仿真器)

android - 无法捕获屏幕截图。被安全策略阻止。盖乐世 S6。安卓6.0

android - Samsung Galaxy Camera Android API - 自定义相机应用程序

Android Studio Gradle 无法解析符号 'applicationVariants'

android - FirebaseUi phone auth Android 出现未知错误

Android 使用mockK测试 View 模型

NFC 标准(NFC 论坛、ISO/IEC、ECMA

Android nfc从三星nexus读取卡