【问题标题】:Is there a possibility to read NFC tags from Android without intents?是否有可能在没有意图的情况下从 Android 读取 NFC 标签?
【发布时间】:2020-04-04 21:23:51
【问题描述】:

在 Android 上使用 NFC 时我有点迷茫。

我想做以下事情: - 使用一个 NFC 标签作为令牌 - 在 Android 中阅读并展示一些功能 - 如果手机从令牌拨号消息中删除 - 如果手机重新连接或连接到另一个令牌显示另一个功能

我在 AndroidManifest 文件中为android.nfc.action.NDEF_DISCOVERED 使用了一个意图过滤器,并为过滤android.nfc.action.TECH_DISCOVERED 使用了一个xml。

主要活动成功打开,如果附加了另一个标签

 @Override
    protected void onNewIntent(Intent intent) { ...}

被调用。

我还使用计时器来检查标签是否仍然连接(基本上是 ndefTag.connect() ; NdefMessage ndefMsg= ndefTag.getNdefMessage(); 然后查看是否收到任何内容。

我将 Activity 的启动模式设置为 android:launchMode="singleInstance,否则每次将新标签放入手机时,应用程序都会完全重新启动。

现在我完全迷失了意图系统,因为通常 main 正在启动其他活动,而意图是在丢失当前活动和当前屏幕信息的情况下跳回 main。

所以我的问题是关于两个部分: - 是否真的如此复杂以至于需要使用意图?我不能以某种方式连接到手机的 NFC 阅读器,然后每隔几秒就轮询一次吗?询问是否连接了标签以及标签上有什么数据。使用 NDEF_DISCOVERED/TECH_Discovered 组合,我看到有时它只是挂起。 (如果它不是 SingleInstance-Activity - 有时也不会启动新活动)。 (首选) - 或者是否有一些干净的方法可以将 NFC 意图转发到应用程序的实际活动?或者说在运行时不应该调用main,而是一些处理连接的后台任务?

【问题讨论】:

    标签: android tags nfc


    【解决方案1】:

    是的,可以在没有 Intent 的情况下读取 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,您的应用程序在系统应用程序读取卡片时暂停,然后恢复您的应用程序并将新意图传递给它。这种暂停可能是您失去活动状态的原因。

    使用enableReaderMode,您的应用在读取卡片时不会暂停。

    基本操作是:-

    1) 实现回调方法

    2) OnResume enableReaderMode 和 OnPause disableReaderMode

    3) 在 onTagDsicovered (回调函数) 连接一次标签,getNdefMessage 在循环中使用 try 块处理标签离开读取范围时产生的异常或在读取一次 NDEF 消息后循环测试isConnected

    4) 根据 NDEF 消息运行你想要的动作

    5) 当标签离开读取范围时做你想做的事情(或者只是让读取器回调线程退出,准备读取新卡。

    【讨论】:

    • 谢谢。是的,您对 enableForegroundDispatch 的看法是正确的——它触发了活动的 onPause。
    • enableReaderMode 还可以让您控制声音以及在单独的线程中运行,这对于编写而言至关重要,因为它控制用户行为。如果你想要一些具体的代码示例,请问,我可以从我的 NFC 应用程序中提取它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    相关资源
    最近更新 更多