使用导航组件和单个 Activity 时,如何防止我的设备读取每个片段中的 NFC 标签?

How to prevent my device reading NFC Tags in every Fragment when using NavigationComponent and a single Activity?

背景

我在我的应用程序中包含了 Navigation Component,这基本上意味着我有一个导航 Activity 和多个 Fragments 来显示我的视图和数据。该应用程序能够从身份证中读取 NFC 个标签。

我遵循了 Android 开发人员的实施指南以包含 NFC 标签读取功能,在他们的示例中,他们在 AndroidManifest 中编辑 Activity 并启用 ForegroundDispatcher 在他们的 Activity 中。由于我的应用程序中基本上只有一个 Activity,因此 NFC 功能可用。

我正在使用 setIntent(intent) 将传入的 Intents 委托给我的片段。只有应该与 NFC 一起工作的 Fragment 会处理 Intent,而其他的则忽略它。

问题

问题是,当我将 NFC 卡靠近 phone 时,phone 开始振动,因为它识别出 NFC 设备。这发生在每个 Fragment 中并且是不需要的行为。

问题

我该怎么办,或者我是否坚持这种行为?我阅读了一些关于在片段中启用 foregroundDispatcher 但答案几乎总是在我的 Activity 中处理它并且该函数还需要 Activity.

不要使用ForegroundDispatcher(除非你真的需要在API 19之前进行NFC),请改用更新更好的enableReaderMode方法。

声音由系统 NFC 应用程序生成,enableForegroundDispatch 您无法控制声音加上 enableForegroundDispatch 有一个不好的副作用,即暂停您的应用程序以读取 NFC 标签,并且可以有时不可靠,尤其是写入 NFC 标签时。

使用enableReaderMode,您可以使用FLAG_READER_NO_PLATFORM_SOUNDS标志控制系统NFC App是否发出声音。

因此,您的设计将不得不稍作更改,因为当发现 NFC 标签时,应用程序中的另一个线程会调用 onTagDiscovered 方法,该线程必须将数据传递给片段(如它不能直接与 UI 线程交互)。一种可能的方法是 Activity 中的 onTagDiscovered 方法在共享视图模型中设置一个值,然后对其感兴趣的片段“观察”这个值的变化并根据包括做出反应发出声音并自行振动。

enableReaderMode 的完整示例位于

请注意,仅在片段中启用 ForeGroundDispatch NFC 不是一个好主意,因为当出现 NFC 标签时,系统 NFC 应用程序很可能仍会发出声音,而且您的应用程序可能无法处理该事件是因为片段不是 运行 那么系统 NFC 应用程序也可能会在您的应用程序上显示它自己的屏幕。