Android 设备之间的 NFC 交互触发 Android Beam 而不是 HCE

NFC interaction between Android devices triggers Android Beam instead of HCE

我正在开发充当独立 POS 终端的支付终端模拟器。它适用于芯片非接触式卡(它可以通过适当的协议与它们通信)、启动交易、从它们读取数据等。

我还想处理通过 Google Pay 完成的交易(POS 终端将 Google Pay 识别为普通的非接触式卡 - 相同的协议)。但是,当我有一台 Android 设备和我的 POS 终端应用程序 运行,以及另一台 Android 设备和 Google Pay 时,当我同时触摸两个设备时,我的 POS 应用程序被最小化并显示 "Touch to send beam"。我本以为 onNewIntent 方法会在 POS 终端应用程序中调用。

如何处理?预期的行为是我的应用程序(POS 终端)没有最小化,另一方面 phone Google 支付应用程序被触发。

我是否应该在开始时发送一些东西,以便 Android 和 Google Pay 可以识别这是一个支付交易?或者也许一些特定的意图过滤器可以在 POS 终端 Android 设备上处理这个问题?

我还观察到,在三到四次尝试中的一次中,我似乎得到了预期的行为 - onNewIntent 在我的应用程序中被调用。这看起来像是我的应用程序和默认 Android Beam 行为之间的竞争条件。

您不能使用常规标签调度机制(意图过滤器或前台调度系统)与另一个在卡仿真 (HCE) 模式下运行的 Android 设备进行交互。问题是两个 Android 设备通常会自动发现它们的对等模式功能。因此,它们以 P2P 模式连接并触发 Android Beam(在 P2P 之上的 LLCP 之上的 SNEP)。请注意,即使您在两台设备上禁用 Android Beam,它们仍会选择 P2P 模式。

要克服这个问题,您需要使用 reader mode API。这允许您在 activity 处于前台时禁用 P2P 模式并有选择地启用 reader/writer 模式功能(例如不同的技术)。