首页 > 解决方案 > 强制 NFC 调度事件 // 禁用和重新启用 NFC 系统功能

问题描述

背景

我正在研究嵌入式系统和 Android 应用程序之间的 NFC 通信接口。嵌入式系统可以对写入 NFC 标签的 NDEF 消息的命令做出反应。在命令处理期间,RF 场处于非活动状态。通常,在命令处理终止时,android.nfc.action.NDEF_DISCOVERED会触发事件,我可以在我的应用程序中处理响应。

不幸的是,情况并非总是如此,有时 Android 设备不会发出此类事件。如果我从 NFC 标签中物理移除 Android 设备并再次将其放在标签上,NDEF_DISCOVERED则会触发该事件。我想实现一个触发NDEF_DISCOVERED事件的轮询机制。

我试过的

我开始禁用和重新启用 NFC 适配器的 ReaderMode,但没有成功:

    public void reconnectNfc() {
      NfcAdapter nfcAdapter = getNfcAdapter();
      nfcAdapter.disableReaderMode(this);
      getNfcAdapter().enableReaderMode(...);     
    }

禁用阅读器模式不会触发调度事件。

这个问题的公认答案: android get NFC tag without using dispatch system 表明我可以得到一个更新的Tag对象以这种方式进行调度,但不幸的是它对我不起作用。

有没有办法关闭再打开 NFC 系统功能?

交互系统

在我的 AndroidManifest.xml 中,我指定了一个在 Android 系统接收到 NFC 调度意图时启动的活动:

    <activity
        android:name="myNfcDispatchActivity"
        ...>

        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>

中的调度myNfcDispatchActivity执行如下:

@Override
protected void onResume() {
    super.onResume();

    getNfcAdapter().enableReaderMode(this, 
        tag -> {
          Handler mainHandler = new Handler(Looper.getMainLooper());
          mainHandler.post(() -> dispatchTag(tag));
        },
        NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS | NfcAdapter.FLAG_READER_NFC_A,
        null);
}

我在方法中处理tag对象的NDEF消息dispatchTag()

标签: androidnfc

解决方案


这个问题的公认答案: 如何重新连接到 IsoDep 标签? 表明没有办法以编程方式解决我的问题

在这种情况下,您所能做的就是物理移除标签并再次将其呈现给阅读器。


推荐阅读