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

标签 android android-intent nfc ndef android-beam

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

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

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

<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 会重新启动,但我永远看不到发送消息的选项。

我怎样才能实现理想的场景?

最佳答案

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

但是,只需对现有场景进行少量修改,就可以在两台 Android 设备之间使用两次点击方法。您只需要添加一个前台调度来拦截您传入的 NDEF 消息,从而阻止 Android 重新启动您的 Activity :

@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 上的应用程序处于 Activity 状态时,它会为 Beam 注册自己的 NDEF 消息。然后,在第二次点击时,Beam UI 将显示在设备 B 上,点击 Beam 屏幕会将响应 NDEF 消息发送到设备 A。

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

关于android - 通过 NFC 启动应用程序并在启动时发回 NDEF 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19266944/

相关文章:

android - 将单选按钮分组

javascript - 支持 WebGL 但来自 Three.js 的等距柱状全景示例无法在设备上运行?

android - "Rotation Locker"是如何工作的?

android - Cordova NFC 插件 : nfc has no method 'connect' 出现问题

尝试设置默认应用程序时 Android 设置崩溃(基于主机的卡模拟)

android - 如何使用 NFC 标签 ACTIONTEC DISCOVERED 主要 Activity ?

android - ionic build android failure - 任务 processDebugResources 执行失败

android - 如何制作服务Android编程

android - 使用 Intent.ACTION_CREATE_DOCUMENT(存储访问框架)选择一个目录/文件

android - 如何从通知中打开 fragment