0

我目前正在开发一个简单的应用程序,它会扫描 NFC 标签并从中读取数据。为了实现它,我在这里遵循了这个例子

为了测试,我使用的是真正的安卓设备(三星 Galaxy J6)和 Mifare NFC 卡。

在应用程序启动时,一切正常,NfcManager 已成功启动,标签事件已注册(使用 NfcManager.registerTagEvent),但在调用requestTechnology并扫描 NFC 卡时出现问题。

我注意到的区别在于 Android 中的意图:在运行requestTechnology并针对手机扫描卡之前,意图和附加到它的操作看起来像这样=> 操作在主线程上。

之后,意图和动作看起来像这样

对我来说,动作从主线程发生变化似乎很奇怪。

Android 代码与上面链接中给出的完全相同,React Native 中的代码如下所示:

 _read = async () => {
    try {
      const enabled = await NfcManager.isEnabled();
      console.warn('Enabled: ', enabled);

      await NfcManager.registerTagEvent((tag) => {
        console.warn('Tag Discovered', tag);
      }, 'Hold your device over the tag', true);
  
      let tech = Platform.OS === 'ios' ? NfcTech.MifareIOS : [NfcTech.MifareClassic, NfcTech.NfcA];
      let resp = await NfcManager.requestTechnology(tech);

      let tag = await NfcManager.getTag()
        .then(() => { console.warn('Tag: ', tag)})
        .catch((err) => console.warn('Tag error: ', err));
     
      {...}

      // this._cleanUp();
    } catch (ex) {
      console.warn(ex);
      this._cleanUp();
    }
  }

除此之外,requestTechnology方法只有在应用程序被带到后台然后立即再次回到前台时才会被解析。这也显得很奇怪……

有谁知道如何解决这些问题并启动和运行 NFC 卡读取过程?

我感谢您的帮助!

4

1 回答 1

0

我不确定您为什么要查看IntentAction,因为它实际上对 NFC 没有意义。

Android 如何处理 NFC 的一些背景知识应该有助于解释它。

在 Android 中,所有标签检测都由系统 NFC 服务/应用程序处理。

当您的应用程序未运行并且检测到 NFC 标签时,系统服务会在看到该类型的标签时确定是否有任何应用程序请求启动。然后,它会制作一个 Intent 以System Launcher启动您的应用程序的主要 Activity,并将有关 NFC 数据的信息捆绑Intent在系统启动器的附加部分中,以便在启动时将 Intent 传递给您的应用程序。

当您正在requestTechnology运行您的应用程序并且您正在告诉系统 NFC 服务将 NFC 数据直接传递给您的应用程序时,系统启动器不需要参与,因为您的应用程序已经在运行。

现在 Android 有两种方法可以将这些数据直接传递给你正在运行的 App,enableForegroundDispatch或者后者更好enableReaderMode

您配置react-native-nfc-manager为使用旧版本enableForegroundDispatch,它告诉系统 NFC 服务将标签详细信息直接发送到您正在运行的 Activity。所以它不需要添加一个Action来告诉系统Launcher该做什么。但是要将Intent包含有关标签数据的附加内容直接传递给您的应用程序,唯一的方法是基本上重新启动您的应用程序,这会导致 aPauseResume.

但是react-native-nfc-manager会为您处理所有这些,因此您不必担心里面有什么Intent

请注意,如果基本上在您正在运行的应用程序中创建一个线程并直接为线程提供标签数据,那么您可以配置react-native-nfc-manager使用enableReaderMode而不是重载意图来向您提供这些数据,因此不需要暂停和恢复您的应用程序(加上你使用这种新方法更好地控制诸如 NFC 检测声音之类的东西)

因此,总体而言,您看到的行为是预期的和正常的,您无需担心或有任何问题。

注意 iOS 以完全不同的方式处理此问题,但再次react-native-nfc-manager通过其 iOS 特定方法处理此问题。

于 2022-01-11T22:35:30.117 回答