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
方法。
因此,如果您的应用在 onPause
和 onResume
中选择性地执行其他操作,则有些区域可能会导致此过程延迟,那么这可能会延迟该过程和应用消息中的其他项目队列可能会延迟 Intent
的处理。
理解的关键是卡上有 NDEF 数据,当它延迟时,来自 OS 的声音也会延迟,还是声音与您的应用程序之间存在延迟 onNewIntent
运行?
如果可以,我不会使用 enableForegroundDispatch
来处理卡片,但使用 enableReaderMode
因为 enableForegroundDispatch
不太可靠,尤其是在写入卡片时。
还注意到某些 Broadcom NFC 控制器中存在 BUG,这意味着它可能会花费太多时间来检查卡是否在实际读取范围内。使用 enableReaderMode
您可以控制此轮询。
还注意到 enableForegroundDispatch
具有大量电源优化,可能无法为卡供电,直到它更接近范围或发生频率较低的长轮询事件之一。同样 enableReaderMode
似乎在这里更好,并且更有可能更快地为卡供电(以使用更多电量为代价)
我有一个应用程序必须能够连续读取主屏幕上的 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
方法。
因此,如果您的应用在 onPause
和 onResume
中选择性地执行其他操作,则有些区域可能会导致此过程延迟,那么这可能会延迟该过程和应用消息中的其他项目队列可能会延迟 Intent
的处理。
理解的关键是卡上有 NDEF 数据,当它延迟时,来自 OS 的声音也会延迟,还是声音与您的应用程序之间存在延迟 onNewIntent
运行?
如果可以,我不会使用 enableForegroundDispatch
来处理卡片,但使用 enableReaderMode
因为 enableForegroundDispatch
不太可靠,尤其是在写入卡片时。
还注意到某些 Broadcom NFC 控制器中存在 BUG,这意味着它可能会花费太多时间来检查卡是否在实际读取范围内。使用 enableReaderMode
您可以控制此轮询。
还注意到 enableForegroundDispatch
具有大量电源优化,可能无法为卡供电,直到它更接近范围或发生频率较低的长轮询事件之一。同样 enableReaderMode
似乎在这里更好,并且更有可能更快地为卡供电(以使用更多电量为代价)