当前位置: 首页 > 知识库问答 >
问题:

如何防止我的设备在使用NavigationComponent和单个活动时读取每个片段中的NFC标记?

陶宏浚
2023-03-14

我在我的应用程序中包括了导航组件,这基本上意味着我有一个导航活动和多个显示我的视图和数据的片段。该应用程序能够读取身份证上的NFC标签

我遵循Android开发者的实施指南,加入了NFC标签读取功能,在他们的示例中,他们在AndroidManifest中编辑活动,并在活动中启用ForegroundDispatcher。由于我的应用程序中基本上只有一项活动,因此NFC功能可用。

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

问题是,当我把NFC卡靠近手机时,手机开始振动,因为它识别到了NFC设备。这发生在每个片段中,是不必要的行为。

对此我能做些什么,还是我被这种行为所困扰?我读了一些关于在片段中启用前台Dispatcher的文章,但是答案几乎总是在我的活动中处理它,并且函数也需要一个活动。


共有1个答案

伍弘盛
2023-03-14

不要使用Foreground Dispatcher(除非您真的需要在API 19之前执行NFC),而是使用更新更好的enableReaderMode方法。

声音是由系统NFC应用程序生成的,使用enableForegroundDispatch您无法控制声音,而且enableForegroundDispatch会导致应用程序暂停以读取NFC标签的不良副作用,有时可能不可靠,尤其是在写入NFC标签时。

使用enableReaderMode,您可以通过标志\读取器\否\平台\声音标志来控制系统NFC应用程序是否发出声音。

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

enableReaderMode的完整示例位于https://stackoverflow.com/a/64921434/2373819

注意:仅在片段中启用ForeGroundDispatchNFC是一个坏主意,因为当显示NFC标记时,系统NFC应用程序可能仍然会发出声音,并且由于片段未运行,您的应用程序可能无法处理事件,因此系统NFC应用程序也可能会在您的应用程序上显示自己的屏幕。

 类似资料:
  • 我在这里找到了一些关于使用Android阅读NFC标签的最近帖子。我得到的结论是,执行NFC读取动作会触发一个分离的意图。 那么第一个问题:在我的清单中列出意图过滤器是否必要? 我认为这是没有必要的,因为我不想推出我的应用程序通过NFC标签事件,对吗? 第二个问题:我如何保持我的NFC阅读逻辑/功能与我的app/活动相关? 例如,在iOS中,在VC中需要时有一个简单的NFC会话。

  • 在我的应用程序中,我有一个显示某种级别的列表视图。 我用资产中的一个文件填充listview。我在资产中的文件如下所示: 我的listview显示级别,当我单击listview的某个项目转到另一个活动时,“转到下一个活动”也会显示我的问题和选项。一切正常,我的问题是,当在第二个活动中按后退按钮转到第一个活动时,第一个活动再次启动,我的onCreate方法再次运行,我的listview项增加。(例如

  • 我有两项活动。我想用第一个活动(如)读卡,第二个活动写卡。因为在发现卡时,活动需要处于活动状态。因此,我对这两项活动都使用了以下设置: 然而,我的问题是,当我在第二个活动中扫描NFC卡时,手机会显示第一个和第二个活动的意向选择器。 那么,当我在第二个活动(反之亦然)中时,如何通过代码禁用第一个活动的intent过滤器? 这是完整的AndroidManifest文件:

  • 在我的应用程序中,我使用了一个活动和两个片段。该应用程序使用带有容器的布局,因此片段是通过事务添加的。第一个片段包含列表视图,另一个片段包含列表视图项的详细视图。两个片段都使用setRetainInstance(true)。片段是通过替换事务添加的,并设置了addToBackStack(null)。列表片段包含一个实例变量,其中包含列表的一些信息。现在我正在切换到详细并按回,实例变量为null。我

  • 并且显示错误 正如您所看到的,当我单击Button时,我想从CurrentWeatherFragment调用一个方法,从ForecastWeatherFragment调用一个方法。

  • 我有两个API,一个是授权,另一个是创建交易。当用户授权生成访问令牌时。然后我们传递生成的令牌和用户名来创建事务。 我希望这个功能测试能够使用JMeter实现自动化。因此,为此,我有用户.csv文件,其中包含用户名和密码以及另外两个CSV作为创建交易1.csv,创建交易2.csv其中这两个CSV包含记录。因此,我希望用户 1 读取创建事务 1.csv和用户 2 读取创建事务 2.csv 任何想法,