我正在开发一个使用 NFC 与其他设备交互的 Android 应用程序。这种交互基本上包括两个步骤:
- 当设备通过 NFC 从其他设备接收到特定的 URI 时,应用程序就会启动。
- 当应用程序启动时,它会将 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
班级实现CreateNdefMessageCallback
和OnNdefPushCompleteCallback
. 代码如下所示:
@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
则会重新启动,但我永远看不到发送消息的选项。
我怎样才能达到预期的效果?