是否有可能无意中从 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回调线程退出,准备读取一张新卡。