Activity 中的 NFC 读取进入睡眠状态?

NFC reading in Activity goes to sleep?

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

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

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

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);
        }

如果标签被发现后1分钟内没有使用它进行读写,nfc会自动关闭,需要切换nfcoff/on或screenoff/on . 如果您继续发送和命令来标记并继续接收回馈,界面将保持打开状态。

使用enableForegroundDispatch方法的粗略操作顺序是:-

1) 当卡片进入范围时,您的应用程序将暂停并且 Android OS "App" 启动 运行

2) Android OS "App" 开始读取卡以确定类型,如果卡包含 NDEF 数据,它将读取所有数据(这可能需要很短的时间同时取决于卡和数据)。如果卡在尝试读取时进出范围,这种情况可能会发生很多次。

3) Android OS "App" 播放声音并将 Intent 插入应用程序的消息队列。

4) 您的应用程序已恢复,它将开始处理它的消息队列,当它到达包含 Intent 的消息时,它将触发 newIntent 方法。

因此,如果您的应用在 onPauseonResume 中选择性地执行其他操作,则有些区域可能会导致此过程延迟,那么这可能会延迟该过程和应用消息中的其他项目队列可能会延迟 Intent 的处理。

理解的关键是卡上有 NDEF 数据,当它延迟时,来自 OS 的声音也会延迟,还是声音与您的应用程序之间存在延迟 onNewIntent 运行?

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

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

还注意到 enableForegroundDispatch 具有大量电源优化,可能无法为卡供电,直到它更接近范围或发生频率较低的长轮询事件之一。同样 enableReaderMode 似乎在这里更好,并且更有可能更快地为卡供电(以使用更多电量为代价)