首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过NFC启动应用程序,并在启动时发送一条NDEF消息

通过NFC启动应用程序,并在启动时发送一条NDEF消息
EN

Stack Overflow用户
提问于 2013-10-09 08:38:09
回答 1查看 3.1K关注 0票数 1

我正在开发一个使用NFC与其他设备交互的Android应用程序。这种互动主要由两个步骤组成:

  1. 当设备从其他设备接收到NFC指定的URI时,应用程序就会启动。
  2. 当应用程序启动时,它会向另一个设备发送一条NDEF消息。

对于第一步,我已经将以下行添加到AndroidManifest.xml文件中。这样,当设备接收到类型为MainActivity的URI时,将启动myprotocol:something

代码语言:javascript
复制
<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。代码如下:

代码语言:javascript
复制
@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消息。

问题是,如果我同时添加,当我点击到另一个设备时,应用程序就会启动,但是触摸到光束的界面永远不会显示出来。如果我分开设备并再次点击,MainActivity就会重新启动,但我永远看不到发送消息的选项。

我如何才能达到所需的情景?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-09 14:52:33

在两个Android设备上使用Beam是不可能的(请注意,对于其他设备,特别是当一个是Android设备,一个是专用的NFC阅读器或一个设备,您可以在一个低级别上控制NFC功能,或者一个模仿NFC标记的设备)。

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

代码语言:javascript
复制
@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将显示在设备B上,单击Beam屏幕将向设备A发送响应NDEF消息。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19266944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档