Android 什么';enableReaderMode和enableForegroundDispatch之间的区别是什么?

Android 什么';enableReaderMode和enableForegroundDispatch之间的区别是什么?,android,tags,nfc,hce,android-beam,Android,Tags,Nfc,Hce,Android Beam,我发现了两种让Android应用程序检测和处理NFC标记的方法: NfcAdapter.enableReaderMode(活动、回调、标志、附加)然后在回调中接收标记信息 NfcAdapter.enableForegroundDispatch(活动、意图、筛选器、技术列表)然后在onNewIntent(意图)活动方法中接收标记信息 我目前使用的是第二种方法,但是,我最近发现了enableReaderMode方法,我想知道使用它来处理NFC标记是否更好 那么enableReaderMode和ena

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

  • NfcAdapter.enableReaderMode(活动、回调、标志、附加)
    然后在回调中接收标记信息

  • NfcAdapter.enableForegroundDispatch(活动、意图、筛选器、技术列表)
    然后在
    onNewIntent(意图)
    活动方法中接收标记信息

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


    那么
    enableReaderMode
    enableForegroundDispatch
    之间的区别是什么呢?

    enableReaderMode
    :当此活动处于前台时,将NFC控制器限制为读卡器模式

    enableForegroundDispatch
    :将发现的标记分派给应用程序时,这将优先考虑前台活动

    因此,基本上您可以将两者用于相同的目的,即读取/写入标记
    enableReaderMode
    被Android手机与Broadcom NFC控制器结合使用,因为状态检查存在缺陷。据我所知,只有
    enableReaderMode
    可以通过增加
    EXTRA\u READER\u PRESENCE\u CHECK\u DELAY来避免这种情况

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

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

    读卡器模式API Android 4.4中引入了读卡器模式API(
    NfcAdapter.enableReaderMode()
    )。因此,并非所有具有NFC功能的Android设备都支持这种方法

    与前台调度系统不同,阅读器模式API确实改变了Android监听NFC设备的方式。读卡器模式API禁用对等模式。例如,这允许您发现同时启用对等模式和卡仿真模式的其他设备的卡仿真模式(Android HCE就是这样)。(通常,此类设备会被发现为点对点设备,Android应用程序将无法访问卡仿真功能。)

    此外,您可以更改NFC读卡器模式的特定参数,例如,您可以:

    • 定义NFC阅读器轮询的标记技术
    • 通过向标签发送特定的命令序列并检查是否仍然收到响应,定义Android测试标签是否仍然存在的间隔
    • 停止Android自动向标签发送命令,以测试标签是否包含NDEF消息
    • 停止Android在标签发现时播放声音
    注意:Android 10上的行为可能有所不同
    根据安卓10上的评论,上述情况可能不再适用(他在Pixel2上进行了测试)。当只使用
    enableReaderMode()
    (没有额外的
    enableForegroundDispatch()
    )时,设备似乎会显示“此NFC标记不支持应用程序”的提示,即使标记已正确调度到注册的读卡器模式回调方法(
    ontagDiscoveryd()
    )。

    嘿,Michael,非常有用的信息。谢谢还有一个问题:如果我在前台活动中启用读卡器模式,这是否意味着它也会像前台调度系统那样覆盖现有的标签调度系统?@Yashasvi是的,读卡器模式也会覆盖所有其他标签调度。@MichaelRoland,在Android 10上,enableReaderMode覆盖所有其他标记调度似乎不再是真的了。在调用enableReaderMode扫描标记时,我从Android操作系统收到一条toast消息,上面写着“此NFC标记不支持任何应用程序”。但是,我仍然在onTagDiscovered回调中接收标记,并正常处理它。使用enableForegroundDispatch可防止Android操作系统toast显示。@AdamJohns是在谷歌像素设备上还是在某个第三方OEM的设备上?@igorganapolsky是的。NDEF消息只是可以从标记中检索的一种可能的特定数据结构。您是否使用过
    enableReaderMode
    ?Android R中是否仍存在上述缺陷?两者是否可以同时可靠地使用?即,使用enableForegroundDispatch优先考虑当前活动(从而也阻止所有其他应用程序),但不实际倾听意图。然后同时使用enableReaderMode进行实际读取?@ropsnou您最终是否同时使用了这两个选项?“为什么呢?”JohanFerreira No.经过一些测试,很明显只使用enableReaderMode就足够了