enableReaderMode 和 enableForegroundDispatch 有什么区别?

What's the difference between enableReaderMode and enableForegroundDispatch?

我发现了两种让 Android 应用检测和处理 NFC 标签的方法:

  1. NfcAdapter.enableReaderMode(activity, callback, flags, extras)然后在回调中接收标签信息

  2. NfcAdapter.enableForegroundDispatch(activity, intent, filters, techLists) 然后在 onNewIntent(intent) activity 方法中接收标签信息。

我目前使用第二种方法,但是,我最近发现了 enableReaderMode 方法,想知道用它来处理 NFC 标签是否更好。

那么enableReaderModeenableForegroundDispatch有什么区别呢?

enableReaderMode:当此 Activity 在前台时,将 NFC 控制器限制为 reader 模式。

enableForegroundDispatch:这将在将发现的标签分派给应用程序时优先考虑前台activity。

所以基本上您可以将两者用于同一目的,即 reading/writing 一个标签。 enableReaderMode 由 Android 手机与 Broadcom NFC 控制器结合使用,因为存在检查存在错误。据我所知,只有 enableReaderMode 可以通过增加 EXTRA_READER_PRESENCE_CHECK_DELAY 来避免这种情况。

前台调度系统

前台调度系统(NfcAdapter.enableForegroundDispatch())自Android 2.3.3(基本上是Android NFC的开始)就存在了。因此,所有具有 NFC 功能的 Android 设备都支持此方法。

前台调度系统用于提供当前在处理 NFC 发现事件(即发现的 NFC 标签和从对等设备接收的 NDEF 消息)时处于前台优先级的 activity。这意味着即使为特定标签类型或 NDEF 数据注册了另一个应用程序(通过 AndroidManifest.xml 中的意图过滤器),NFC 事件仍将传递到前台 activity 而不是另一个 activity。因此,该方法不会改变 Android 侦听 NFC 设备(NFC 标签、P2P 设备)的方式,它只会改变处理已发现设备的优先级。

Reader-模式API

reader-模式 API (NfcAdapter.enableReaderMode()) 是在 Android 4.4 中引入的。因此,并非所有具有 NFC 功能的 Android 设备都支持此方法。

与前台调度系统相反,reader-模式 API 确实改变了 Android 侦听 NFC 设备的方式。 reader-mode API 禁用点对点模式。例如,这允许您发现同时启用对等模式和卡模拟模式的其他设备的卡模拟模式(Android HCE 就是这种情况)。 (通常,这样的设备会被发现为点对点设备,Android 应用程序将无法访问卡模拟功能。)

此外,您可以更改 NFC reader 模式的特定参数,例如你可以:

  • 定义 NFC reader 轮询的标签技术,
  • 定义 Android 通过向标签发送特定命令序列并检查是否仍收到响应来测试标签是否仍然存在的时间间隔,
  • 停止Android自动向标签发送命令以测试标签是否包含 NDEF 消息,
  • 停止 Android 在发现标签时播放声音。

注意:Android10

上的行为可能有所不同

根据 Adam Johns 的评论,上述情况在 Android 10 上可能不再成立(他在 Pixel 2 上进行了测试)。当仅使用 enableReaderMode()(没有额外的 enableForegroundDispatch())时,设备似乎显示祝酒词 "No supported application for this NFC tag",尽管标签已正确分派到已注册的 reader 模式回调方法(onTagDiscovered()).