实体设备上的Android NFC

移动开发 2026-07-08

我在用 react-native-nfc-manager 开发一款在iOS和 Android上扫描NFC标签的应用。两部分都能工作,这很好,但并非在所有设备上都能正常工作。例如:

工作设备:

  • iPhone 17 Pro Max (iOS 26.5)
  • Samsung Fold Z5 (Android 16)
  • OnePlus 7 PRO (Android 12)

不可用设备:

  • Samsung S24 (Android 16, 个人设备)
  • Samsung S20 FE (Android 13, 个人设备)
  • Google Pixel 9A (Android 16, 个人设备)
  • Samsung A53 (Android 16)

这段代码在后台监听标签被扫描,这样用户就不需要一直按按钮:

  useEffect(() => {
    if (Platform.OS !== "ios" && isNfcAvailable) {
      let isActive = true;

      NfcManager.setEventListener(NfcEvents.DiscoverTag, async (tag: TagEvent) => {
        if (!isActive) return;
        showNFCScreen();

        if (tag?.ndefMessage?.[0]) {

          ...

        } else {
          setNfcScanError(1);
        }
      });

      NfcManager.registerTagEvent();

      return () => {
        isActive = false;
        NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
        NfcManager.unregisterTagEvent();
      };
    }
  }, [isNfcAvailable]);

标签值示例:

{"id": "0800B00B", "techTypes": ["android.nfc.tech.IsoDep", "android.nfc.tech.NfcA"]}

当将不可用设备靠近标签时,出于某种原因就无法读取。

Samsung A53 上的ADB日志

06-17 13:35:52.536  3245 12507 E libnfc_nci: nfaConnectionCallback: NFA_SELECT_RESULT_EVT error: status = 5
06-17 13:35:52.543  3245 12507 E libnfc_nci: nfc_ncif_proc_deactivate - evt_data.deactivate.reason 0, nfc_cb.deact_reason = 0
06-17 13:35:52.544  3245 12507 E libnfc_nci: NfcTag::selectNextTagIfExists: only found NFC-DEP technology.
06-17 13:35:52.547  3245 12507 E [NFC_SE]SamsungExtension: onTagConnected = false
06-17 13:35:52.858  3245 12507 E [NFC_SE]SamsungExtension: onTagConnected = true
06-17 13:35:52.860  3245 12507 E [NFC_SE]SamsungExtension: onTagConnected = true
06-17 13:35:52.865  3245 12507 E libnfc_nci: nfaConnectionCallback: NFA_SELECT_RESULT_EVT error: status = 5
06-17 13:35:52.870  3245 12507 E libnfc_nci: nfc_ncif_proc_deactivate - evt_data.deactivate.reason 0, nfc_cb.deact_reason = 0
06-17 13:35:52.870  3245 12507 E libnfc_nci: NfcTag::selectNextTagIfExists: only found NFC-DEP technology.
06-17 13:35:52.871  3245 12507 E [NFC_SE]SamsungExtension: onTagConnected = false
06-17 13:35:53.193  3245 12507 E [NFC_SE]SamsungExtension: onTagConnected = true
06-17 13:35:53.195  3245 12507 E [NFC_SE]SamsungExtension: onTagConnected = true
06-17 13:35:53.198  3245 12507 E libnfc_nci: nfaConnectionCallback: NFA_SELECT_RESULT_EVT error: status = 5

解决方案

你的标签看起来不像NDEF,因此回调可能不会像这样触发(NDEF的 techType是 "android.nfc.tech.Ndef")。

尝试修改:

NfcManager.registerTagEvent();

NfcManager.registerTagEvent({
  isReaderModeEnabled: true,
  readerModeFlags:
    NfcAdapter.FLAG_READER_NFC_A |
    NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
});

并且不要使用 tag?.ndefMessage,例如改用 tag?.techTypes?.includes('android.nfc.tech.IsoDep')

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章