关闭 reader 应用程序的 NFC 卡模拟

NFC card emulation with closed reader application

我在两台 Android 设备上有两个应用程序,类似于 NFC 示例中的 CardEmulation 和 CardReader。

我想将数据从一台 Android 设备上的主机卡仿真应用程序 运行 发送到第二台 Android 上的 reader 应用程序 运行设备。这适用于两个应用程序都在前台打开的情况。

但是如果我关闭 reader 应用程序,我将无法再向它发送数据。相反,当两个 phone 并在一起时,它们会激活光束传输。但是,我想让 reader phone 在两个 phone 放在一起时自动启动 reader 应用程序。

所以问题是:

  1. 我可以从 HCE 应用程序发送数据,以便 reader 在设备彼此靠近时收到 TECH_DISCOVERED 意图吗? (我们不想要 Beam 模式的额外接受点击。)

  2. 如果那不可能,HostApduService 可以发送数据以便 reader 接收到 NDEF_DISCOVERED 意图吗?

很遗憾,这是不可能的。由于 Android NFC 堆栈实现其他 NFC 设备轮询的方式(点对点模式和 NFC 标签),无法在一个 Android 设备上启动 reader 应用程序通过另一个 Android 设备上的基于主机的卡仿真 (HCE) 应用程序。

Android NFC 堆栈,默认情况下轮询 NFC 标签和 NFC 点对点设备。因此,当两个 Android 设备放在一起时,它们会自动通过 NFC 点对点模式进行通信,而 not 通过 reader/writer 模式+卡模拟模式。

因此,"reader" 设备无法检测到第二台设备上的 HostApduService 运行。因此,Android 设备无法模拟会触发应用程序(过滤 NDEF_DISCOVERED 意图甚至 TECH_DISCOVEREDTAG_DISCOVERED 意图)在第二个 Android 设备上。

在一个 Android 设备(即处于 reader/writer 模式)和第二个 Android 设备上的 HCE 应用程序(HostApduService)之间进行通信的唯一方法是通过使用 reader mode API)。这会禁用点对点轮询,从而允许 reader Android 设备发现其他设备的卡仿真模式。但是,为了使用此 API,您的应用程序必须已经在 reader 设备上具有前景 activity 运行。

请注意,禁用 Android Beam(通过“设置”应用程序)不会禁用点对点模式。所以这样做不会改变任何东西。