我正在开发一款Android应用,可与使用NFC的其他设备进行互动。这种互动基本上包括两个步骤:
第一步,我将以下行添加到 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消息时正确启动应用程序。另外,如果我只添加第二部分,如果我在运行应用程序时将设备点击到其他设备,我会看到触摸光束界面,并发送NDEF消息。
问题是,如果我添加两者,当点击其他设备时,应用程序会启动,但 Touch to beam 界面永远不会显示。如果我将设备分开并再次点按,MainActivity
将重新启动,但我从未看到发送消息的选项。
我怎样才能达到预期的效果?
答案 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。