android - 强制 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()
解决方案
这个问题的公认答案: 如何重新连接到 IsoDep 标签? 表明没有办法以编程方式解决我的问题
在这种情况下,您所能做的就是物理移除标签并再次将其呈现给阅读器。
推荐阅读
- regex - 使用正则表达式将字符串分成三部分
- automation - Microsoft Flow - 无法评估模板语言表达式,因为属性“位置”不存在
- nunit - 如何使用 --where for nunit 运行测试用例的子集
- python - 将数据插入到 grakn 模式
- sharepoint-2013 - 使用 SharePoint REST API 将值设置为多值托管元数据字段类型时出错
- python - 为 django 应用程序中的所有用户启用日志条目
- ios - 如何在 Swift 中裁剪图像?
- r - 如何在 R 中为 y_continuous 设置 ylim?
- filter - 过滤仅符合 SAS Enterprise Guide 趋势的数据
- android-fragments - MVVM 交叉异常:无法创建片段。使用 Android Support Fragments 时使用 MvxAppCompatViewPresenter