读取 NFC 技术列表时的奇怪 Android 设备行为

Weird Android device behaviour in reading NFC tech-list

我正在尝试从 2 台设备(Nexus 5 和三星 S5)读取 NFC 标签。

我正在通过前台调度读取标签并使用 ACTION_TECH_DISCOVERED 意图。在 Samsung S5 上,技术列表列出 NfcAMifareClassicNdef,但在 Nexus 5 上,它仅列出 NfcA.

我知道 Nexus 5 不支持 NXP 的 MIFARE Classic 标签。因此,我明白为什么它没有列出 MifareClassic。但是为什么它在技术列表中也没有显示Ndef

当我尝试使用 ACTION_NDEF_DISCOVERED 意图读取标签时,Samsung S5 可以正常读取标签,而 Nexus 5 甚至检测不到它。

这并不奇怪,而是符合预期的行为:

正如您自己发现的那样,Nexus 5 不支持 MIFARE Classic,而三星 S5 支持。 MIFARE Classic 的问题在于它使用了 ISO/IEC 14443-3 中明确定义的防冲突机制,因此可以在所有 Android NFC 设备上检测到。在标准化的防冲突之上,MIFARE Classic 使用专有协议(其框架略有不同并使用专有加密算法)。由于 NXP 不为该协议的 reader 端提供许可证,因此只有 NXP 芯片组实现它。因此,只有配备 NXP 芯片组的设备(如包含 PN547 NFC 控制器的三星 S5)才能访问 MIFARE Classic 卡上的数据。其他设备(例如 Nexus 5 等带有 Broadcom NFC 芯片组或 S5 mini 等三星 NFC 芯片组的设备)不支持 MIFARE Classic 协议,因此无法访问存储在这些芯片上的数据。

因此,MifareClassic 标签技术未在这些设备上显示,因为该平台不支持发送 MIFARE Classic 命令(这是您可以使用 MifareClassic 技术对象执行的操作) .此外,无法发送内存访问命令,也意味着无法访问存储在标签上的数据。这就是为什么没有显示 Ndef 技术的原因:NDEF 是 NFC 标签之上的数据抽象层,因此,无法访问数据意味着也无法通过 NDEF 抽象层访问相同的数据。因此,提供 Ndef 技术对象没有任何意义,因为无论如何您都无法使用它来访问数据。