嗨,我有两个三星 Galaxy S4。我开发了一个基于 NFC 的 android 应用程序,当在运行应用程序的手机(源手机)上触摸一个按钮时,它会将简单的文本发送到正在接触的手机(目标手机)。我的问题是,当我在源手机上运行我的应用程序并将目标手机靠近源手机时,三星的默认应用程序启动(此应用程序显示源手机中当前活动的屏幕截图并要求您触摸屏幕和然后它在目标手机中启动相同的活动)。我想禁用它,以便我开发的应用程序可以正常工作。我如何实现这一目标?
2 回答
尝试实例化NfcAdapter
并调用disableForegroundDispatch
or disableReaderMode
。
如果您想(或必须1 )使用Android Beam,则无法避免 Beam UI(即带有小屏幕截图的活动)。
为了正确使用 Beam(与 Beam UI)并发送您的文本2是执行以下操作:
- 为目标设备上的 Activity 启用前台调度系统,以便您的应用程序立即处理收到的 NDEF 消息。然后,您可以在活动的
onNewIntent()
方法中接收 NDEF 消息(或者更确切地说是 NFC 发现事件。请参阅此答案以了解如何启用前台调度。 使用类似这样的方法(例如在接收活动的
onCreate()
方法中)禁用目标设备上的活动的发送:NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter != null) { nfcAdapter.setNdefPushMessage(null, this); }
将源设备发送的 NDEF 消息更改为您实际要发送的 NDEF 消息(例如,包含您的文本记录的 NDEF 消息)。如果您不这样做,Android 将(默认情况下)发送一个 Android 应用程序记录,让您的默认活动在目标设备上启动。您可以像这样设置 NDEF 消息(例如在发送活动的
onCreate()
方法中):NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter != null) { byte[] text = "Hello World!".getBytes("UTF-8"); byte[] recordPayload = new byte[3 + text.length]; recordPayload[0] = (byte)0x02; //UTF-8, 2-byte language code recordPayload[1] = (byte)0x65; //'e' recordPayload[2] = (byte)0x6E; //'n' System.arraycopy(text, 0, recordPayload, 3, text.length); NdefMessage ndefMsg = new NdefMessage( new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, null, recordPayload) ); nfcAdapter.setNdefPushMessage(ndefMsg, this); }
如果两台设备都使用 Android 4.4+,而不是使用 Beam,您可以在一台设备上使用基于主机的卡仿真(HCE),在另一台设备上使用NFC 读卡器模式。当您结合这些功能时(即您在一个设备上拥有 HCE 主机卡仿真服务并将第二个设备置于读卡器模式),两个设备可以使用 ISO 7816-4 APDU 相互通信。这样做的好处是您可以完全跳过烦人的 Beam UI。
1) 如果您使用的是 Android 版本 < 4.4,就会出现这种情况。
2)我假设一个 NDEF 文本记录,对吗?