1

我正在开发一个使用 NFC 与其他设备交互的 Android 应用程序。这种交互基本上包括两个步骤:

  1. 当设备通过 NFC 从其他设备接收到特定的 URI 时,应用程序就会启动。
  2. 当应用程序启动时,它会将 NDEF 消息发送回另一台设备。

第一步,我在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 消息时正确启动。另外,如果我只添加第二部分,如果我在运行应用程序时将我的设备点击到其他设备,我会看到Touch to beam界面,并发送 NDEF 消息。

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

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

4

1 回答 1

1

在两台 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 屏幕会将响应 NDEF 消息发送到设备 A。

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

于 2013-10-09T14:52:33.603 回答