通过NFC启动应用程序并在启动时发回NDEF消息

时间:2013-10-09 08:38:10

标签: android android-intent nfc ndef

我正在开发一款Android应用,可与使用NFC的其他设备进行互动。这种互动基本上包括两个步骤:

  1. 当设备通过NFC从其他设备接收特定URI时,该应用程序将启动。
  2. 当应用程序启动时,它会将NDEF消息发送回另一台设备。
  3. 第一步,我将以下行添加到 AndroidManifest.xml 文件中。这样,当设备收到MainActivity类型的URI时,myprotocol:something将会启动:

    <intent-filter>
         <action android:name="android.nfc.action.NDEF_DISCOVERED" />
         <category android:name="android.intent.category.DEFAULT" />
         <data android:scheme="myprotocol" />
     </intent-filter>
    

    第二步,我的MainActivity类实现了CreateNdefMessageCallbackOnNdefPushCompleteCallback。代码如下所示:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
        adapter.setNdefPushMessageCallback(this, this);
        adapter.setOnNdefPushCompleteCallback(this, this);
    }
    
    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        NdefRecord uriRecord = NdefRecord.createUri("protocol:something");
        NdefMessage message = new NdefMessage(new NdefRecord[] { uriRecord });
        return message;
    }
    
    @Override
    public void onNdefPushComplete(NfcEvent event) {
    
    }
    

    所以,现在问题

    这两个部分可以独立工作,但不是我同时添加到应用程序。

    也就是说,如果我添加第一部分,则在接收NDEF消息时正确启动应用程序。另外,如果我只添加第二部分,如果我在运行应用程序时将设备点击到其他设备,我会看到触摸光束界面,并发送NDEF消息。

    问题是,如果我添加两者,当点击其他设备时,应用程序会启动,但 Touch to beam 界面永远不会显示。如果我将设备分开并再次点按,MainActivity将重新启动,但我从未看到发送消息的选项。

    我怎样才能达到预期的效果?

1 个答案:

答案 0 :(得分:0)

在两台Android设备上使用Beam无法实现一键式处理(请注意,对于其他设备,特别是如果一台是Android,一台是专用的NFC阅读器或可以在较低级别控制NFC功能的设备或模拟NFC标签的设备。)

但是,两个Android设备之间可以采用双击方式,只需对现有方案进行少量修改。您只需添加一个拦截传入的NDEF消息的前台调度,从而阻止Android重新启动您的活动:

@Override
public void onResume() {
    super.onResume();
    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
    PendingIntent pi = PendingIntent.getActivity(
            this,
            0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
            0);
    adapter.enableForegroundDispatch(this, pi, null, null);
}

修改

双击场景的更通用方法是在第一次点击时将NDEF消息从设备A发送到设备B.此NDEF消息在设备B上启动应用程序。在发送NDEF消息后,设备A立即停止发送消息。当设备B上的应用程序处于活动状态时,它会为Beam注册自己的NDEF消息。然后,在第二次点击中,Beam UI将显示在设备B上,单击Beam屏幕将向设备A发送响应NDEF消息。

请注意,设备A必须停止发送其初始NDEF消息。否则,设备B上的应用程序将收到新的NDEF消息,因此无法打开Beam UI。