【问题标题】:NFC reading in Activity goes to sleep?Activity 中的 NFC 读取进入睡眠状态?
【发布时间】:2020-01-24 09:25:55
【问题描述】:

我有一个应用程序必须能够连续读取主屏幕上的 NFC 标签。 有时它可以从 2-3 厘米的距离很好地读取,有时 5-10 秒没有任何反应,即使我多次将卡触摸到内置读卡器。

我认为 NFC 读取器可能会在一段时间后进入睡眠模式,或者我不知道是什么原因造成的。

有什么方法可以确保连续阅读(至少在设备插入时)?

onCreate():

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
    (new Intent(this, this.getClass())).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

onResume():

        NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if ( nfcAdapter != null ) {
            if ( !nfcAdapter.isEnabled() ) {
                this.showNFCSettings();
            }
            nfcAdapter.enableForegroundDispatch(this, this.pendingIntent, null, null);
        }

【问题讨论】:

  • 您正在使用 2 种读取 NFC 卡的模式中的哪一种? enableForegroundDispatchenableReaderMode
  • 我编辑了这个问题。 :) 我正在使用enableForegroundDispatch

标签: android nfc


【解决方案1】:

使用enableForegroundDispatch方法的大致操作顺序是:-

1) 当卡片进入范围时,您的应用程序会暂停并且 Android 操作系统“应用程序”开始运行

2) Android 操作系统“应用程序”开始读取卡以确定类型,如果卡包含 NDEF 数据,它将读取所有数据(这可能需要一段时间,具体取决于卡和数据)。如果卡片在尝试读取时进出范围,这种情况可能会发生多次。

3) Android 操作系统“应用”播放声音并将 Intent 插入到应用的消息队列中。

4) 你的应用程序被恢复,它将开始处理它的消息队列,当它到达带有 Intent 的消息时,它会触发 newIntent 方法。

因此,有些区域可能会在此过程中引入延迟,如果您的应用可以选择在 onPauseonResume 中执行其他操作,那么这可能会延迟该过程,并且应用消息队列中的其他项目可能会延迟 @987654326 @ 正在处理中。

理解的关键是卡上是否有 NDEF 数据,延迟时是来自操作系统的声音也延迟了,还是声音与您的 App onNewIntent 运行之间存在延迟?

如果可以的话,我不会使用enableForegroundDispatch 来处理卡片,但使用enableReaderMode 因为enableForegroundDispatch 不那么可靠,尤其是在写入卡片时。

还注意到,某些 Broadcom NFC 控制器中存在 BUG,这意味着它可能会花费太多时间检查卡是否在实际读取范围内。使用enableReaderMode,您可以控制此轮询。

还注意到https://stackoverflow.com/a/50081331/2373819 enableForegroundDispatch 进行了大量的电源优化,可能无法为卡供电,直到它更接近范围或发生频率较低的长轮询事件之一。同样enableReaderMode 在这里似乎更好,更有可能更快地为卡供电(以使用更多电力为代价)

【讨论】:

  • 谢谢,用enableReaderModeenableForegroundDispatch 好多了,而且阅读范围提高了很多... :)
【解决方案2】:

如果发现标签并且您在 1 分钟内没有使用它进行读写,则 nfc 将自动关闭,您应该关闭/打开 nfc 或关闭/打开屏幕。 如果您继续发送和命令标记并继续接收返回的内容,界面将保持打开状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多