S Beam优先于我的NFC应用程序
-
21-12-2019 - |
题
嗨,我有两个三星galaxy S4。我开发了一个基于NFC的android应用程序,当在运行应用程序的手机(源手机)上触摸按钮时,它会将简单的文本发送到联系人(目标手机)的手机。我的问题是,当我在源手机上运行我的应用程序并使目标手机更接近源手机时,三星的默认应用程序启动(此应用程序显示源手机中当前活动的屏幕截我想禁用这个,以便我开发的应用程序工作没有任何问题。我如何实现这一目标?
解决方案
如果你想(或 有 到1)使用Android Beam,有 非也。 避免Beam UI的方法(这是带有活动小屏幕截图的活动)。
为了正确使用Beam(与Beam UI)并发送您的文本2 是执行以下操作:
- 为目标设备上的活动启用前台调度系统,以便您的应用程序立即处理收到的NDEF消息。然后,您可以在您的活动中接收NDEF消息(或者更确切地说是NFC发现事件)。
onNewIntent()
方法。见 这个答案 关于如何启用前台调度。 使用这样的方法禁用目标设备上的活动(例如:在接收活动的
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); }
如果两个设备都使用Android4.4+,而不是使用Beam,则可以使用 基于主机的卡仿真 (HCE)在一个设备和 NFC阅读器模式 在另一个设备上。当你结合这些功能(即您在一台设备上有HCE主机卡仿真服务,并将第二台设备置于读取器模式),两台设备都可以使用ISO7816-4Apdu相互通信。这样做的好处是,您可以完全跳过烦人的Beam UI。
1)如果您使用的是Android版本,情况就是如此 < 4.4.
2)我假设一个NDEF文本记录,对吧?
其他提示
尝试实例化 NfcAdapter
并调用 disableForegroundDispatch
或 disableReaderMode
.