是否有可能无意中从 Android 读取 NFC 标签?
Is there a possibility to read NFC tags from Android without intents?
在 Android.
中使用 NFC 时我有点迷茫
我想做以下事情:
- 使用一个 NFC 标签作为令牌
- 在 Android 中阅读它并展示一些功能
- 如果 phone 从令牌 dipaly 消息中删除
- 如果 phone 重新连接或连接到另一个令牌显示另一个功能
我在 AndroidManifest 文件中为 android.nfc.action.NDEF_DISCOVERED
使用了一个意图过滤器,并在 android.nfc.action.TECH_DISCOVERED
中使用了一个 xml 过滤器。
主 activity 打开成功,如果附加了另一个标签
@Override
protected void onNewIntent(Intent intent) { ...}
接到电话。
我还使用计时器检查标签是否仍然连接(基本上 ndefTag.connect()
;NdefMessage ndefMsg= ndefTag.getNdefMessage();
然后查看是否收到任何东西。
我将 Activity 的启动模式设置为 android:launchMode="singleInstance
,否则每次将新标签放入 phone 时应用程序都会完全重新启动。
现在我完全迷失了 intent 系统,因为通常 main 正在启动其他活动,而 intent 是在丢失当前 activity 和当前屏幕信息的情况下跳回 main。
所以我的问题是关于两个部分:
- 真的那么复杂,需要使用意图吗?我不能以某种方式连接到 phone 的 NFC reader 并每隔几秒轮询一次吗?询问标签是否已连接以及标签上有哪些数据。使用 NDEF_DISCOVERED/TECH_Discovered 组合,我发现有时它只是挂起。 (如果它不是 SingleInstance-Activity - 新的 activity 有时也不会启动)。 (首选)
- 或者是否有一些干净的方法将 NFC 意图转发到应用程序的实际 activity?或者说在运行时不应该调用 main 而应该调用一些处理连接的后台任务?
是的,可以在没有 Intents 的情况下读取 NFC 卡,这是一个更可靠的过程,尤其是在写入卡时
使用enableReaderMode
代替https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)
基本上你会设置一个回调函数以在发现标签时被调用,回调函数是 运行 在一个单独的线程中而不是一个 Intent 被传递给你的主线程 UI线程。
而在 enableForegroundDispatch
中,您的应用程序会在系统应用程序读取卡片时暂停,然后恢复您的应用程序并将新 Intent 传递给它。这种暂停可能是您失去 activity 状态的原因。
使用 enableReaderMode
您的应用程序在读取卡片时不会暂停。
基本操作是:-
1) 实现回调方法
2) OnResume enableReaderMode 和 OnPause disableReaderMode
3)在onTagDsicovered(回调函数)
连接一次标签,getNdefMessage
在循环中用一个try块来处理标签离开读取范围时产生的Exception或者读取一次NDEF消息后循环测试isConnected
。
4) 运行OnUiThread 根据NDEF消息执行你想要的动作
5) 当标签离开读取范围时,做你想做的(或者让reader回调线程退出,准备读取一张新卡。
在 Android.
中使用 NFC 时我有点迷茫我想做以下事情: - 使用一个 NFC 标签作为令牌 - 在 Android 中阅读它并展示一些功能 - 如果 phone 从令牌 dipaly 消息中删除 - 如果 phone 重新连接或连接到另一个令牌显示另一个功能
我在 AndroidManifest 文件中为 android.nfc.action.NDEF_DISCOVERED
使用了一个意图过滤器,并在 android.nfc.action.TECH_DISCOVERED
中使用了一个 xml 过滤器。
主 activity 打开成功,如果附加了另一个标签
@Override
protected void onNewIntent(Intent intent) { ...}
接到电话。
我还使用计时器检查标签是否仍然连接(基本上 ndefTag.connect()
;NdefMessage ndefMsg= ndefTag.getNdefMessage();
然后查看是否收到任何东西。
我将 Activity 的启动模式设置为 android:launchMode="singleInstance
,否则每次将新标签放入 phone 时应用程序都会完全重新启动。
现在我完全迷失了 intent 系统,因为通常 main 正在启动其他活动,而 intent 是在丢失当前 activity 和当前屏幕信息的情况下跳回 main。
所以我的问题是关于两个部分: - 真的那么复杂,需要使用意图吗?我不能以某种方式连接到 phone 的 NFC reader 并每隔几秒轮询一次吗?询问标签是否已连接以及标签上有哪些数据。使用 NDEF_DISCOVERED/TECH_Discovered 组合,我发现有时它只是挂起。 (如果它不是 SingleInstance-Activity - 新的 activity 有时也不会启动)。 (首选) - 或者是否有一些干净的方法将 NFC 意图转发到应用程序的实际 activity?或者说在运行时不应该调用 main 而应该调用一些处理连接的后台任务?
是的,可以在没有 Intents 的情况下读取 NFC 卡,这是一个更可靠的过程,尤其是在写入卡时
使用enableReaderMode
代替https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)
基本上你会设置一个回调函数以在发现标签时被调用,回调函数是 运行 在一个单独的线程中而不是一个 Intent 被传递给你的主线程 UI线程。
而在 enableForegroundDispatch
中,您的应用程序会在系统应用程序读取卡片时暂停,然后恢复您的应用程序并将新 Intent 传递给它。这种暂停可能是您失去 activity 状态的原因。
使用 enableReaderMode
您的应用程序在读取卡片时不会暂停。
基本操作是:-
1) 实现回调方法
2) OnResume enableReaderMode 和 OnPause disableReaderMode
3)在onTagDsicovered(回调函数)
连接一次标签,getNdefMessage
在循环中用一个try块来处理标签离开读取范围时产生的Exception或者读取一次NDEF消息后循环测试isConnected
。
4) 运行OnUiThread 根据NDEF消息执行你想要的动作
5) 当标签离开读取范围时,做你想做的(或者让reader回调线程退出,准备读取一张新卡。