【问题标题】:NFC card emulation with closed reader application使用封闭式读卡器应用程序的 NFC 卡仿真
【发布时间】:2016-05-12 13:31:11
【问题描述】:
我在两台 Android 设备上有两个应用,类似于 NFC 示例中的 CardEmulation 和 CardReader。
我想将数据从运行在一台 Android 设备上的主机卡模拟应用程序发送到运行在第二台 Android 设备上的读卡器应用程序。这在两个应用程序都在前台打开时有效。
但如果我关闭阅读器应用程序,我将无法再向它发送数据。相反,当两部手机放在一起时,它们会激活 Beam 传输。但是,我想让阅读器手机在两部手机放在一起时自动启动阅读器应用程序。
所以问题是:
我可以从 HCE 应用程序发送数据,以便当设备彼此靠近时阅读器收到TECH_DISCOVERED 意图吗? (我们不希望 Beam 模式的额外接受点击。)
如果不可能,HostApduService 是否可以发送数据,以便阅读器收到 NDEF_DISCOVERED 意图?
【问题讨论】:
标签:
android
android-intent
nfc
hce
nfc-p2p
【解决方案1】:
很遗憾,这是不可能的。由于 Android NFC 堆栈对其他 NFC 设备(点对点模式和 NFC 标签)实施轮询的方式,不可能通过基于主机的卡模拟 (HCE) 应用程序在一个 Android 设备上启动阅读器应用程序另一台 Android 设备。
Android NFC 堆栈默认轮询 NFC 标签和 NFC 对等设备。因此,当两台 Android 设备放在一起时,它们会自动通过 NFC 点对点模式进行通信,而不通过读/写模式 + 卡模拟模式进行通信。
因此,“阅读器”设备无法检测到在第二个设备上运行的HostApduService。因此,Android 设备无法在第二台 Android 设备上模拟会触发应用程序(过滤NDEF_DISCOVERED 意图甚至TECH_DISCOVERED 或TAG_DISCOVERED 意图)的 NFC 标签(包含 NDEF 消息)。
在一台 Android 设备(即处于读取器/写入器模式)和另一台 Android 设备上的 HCE 应用程序 (HostApduService) 之间进行通信的唯一方法是使用 reader mode API)。这会禁用点对点轮询,从而允许读卡器 Android 设备发现其他设备的卡模拟模式。但是,要使用此 API,您的应用程序必须已经在阅读器设备上运行了前台 Activity。
请注意,禁用 Android Beam(通过“设置”应用)不会禁用点对点模式。所以这样做不会改变任何事情。