S Beam优先于我的NFC应用程序

时间:2014-06-03 07:04:59

标签: android nfc samsung-mobile nfc-p2p android-beam

嗨我有两个三星galaxy S4。我开发了一个基于NFC的Android应用程序,当在运行应用程序(源手机)的手机上触摸按钮时,该应用程序将简单文本发送到联系人手机(目标手机)。我的问题是,当我在源手机上运行我的应用程序并将目标手机靠近源手机时,三星的默认应用程序启动(此应用程序显示源手机当前活动的屏幕截图并要求您触摸屏幕,然后在目标手机中启动相同的活动)。 我想禁用它,以便我开发的应用程序没有任何问题。 我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

尝试实例化NfcAdapter并调用disableForegroundDispatchdisableReaderMode

答案 1 :(得分:0)

如果你想(或者 1 )使用Android Beam,有没有方式来避免Beam UI(那就是使用您活动的小屏幕截图的活动。)

为了正确使用Beam(使用Beam UI)并发送文本 2 ,请执行以下操作:

  1. 为目标设备上的活动启用前台调度系统,以便您的应用立即处理收到的NDEF消息。然后,您可以在活动的onNewIntent()方法中接收NDEF消息(或者更确切地说是NFC发现事件。请参阅this answer了解如何启用前台调度。
  2. 使用类似的内容(例如,在接收活动的onCreate()方法中)为目标设备上的活动禁用投影:

    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter != null) {
        nfcAdapter.setNdefPushMessage(null, this);
    }
    
  3. 将源设备发送的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);
    }
    
  4. 如果两台设备都使用Android 4.4+,而不是使用Beam,则可以在一台设备上使用Host-based Card Emulation(HCE),在另一台设备上使用NFC reader mode。当您组合这些功能时(即,您在一台设备上具有HCE主机卡仿真服务并将第二台设备置于读卡器模式),两台设备都可以使用ISO 7816-4 APDU进行相互通信。这样做的好处是你可以完全跳过恼人的Beam UI。



    1)如果您使用的是Android版本,那就是这种情况。 4.4
    2)我假设一个NDEF文本记录,对吗?