实体设备上的Android NFC
我在用 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。