feco-nfc-scan
v1.0.0
Published
Android NFC card scanning (reader mode → UID) for React Native, as a TurboModule
Maintainers
Readme
feco-nfc-scan
Android NFC card scanning for React Native — the reader-mode → UID flow from
PDA_Validator (ScanReadyActivity.onTagDiscovered), as a TurboModule.
Android only. No third-party dependencies: it wraps NfcAdapter directly.
Requires the New Architecture (React Native ≥ 0.76).
Install
npm install feco-nfc-scan # or: yarn add feco-nfc-scan
npx react-native run-android # autolinking + codegen pick up android/The NFC permission and the android.hardware.nfc feature flag are declared in
the library manifest and merge into the host app — nothing to add there.
Use
import { startScan, isEnabled } from 'feco-nfc-scan';
useEffect(() => {
let stop;
startScan(({ uid, techs }) => verifyDriverCard(uid)).then((s) => (stop = s));
return () => stop && stop();
}, []);uidis uppercase hex — the format/drivers/verify-cardand the whitelist tables expect.- Repeat reads of a card left on the reader are dropped for
cooldownMs(default 2000). start()rejects withno_nfc(no hardware) ornfc_disabled(switched off in settings);isSupported()/isEnabled()let you check first.- Reader mode is released automatically while the app is backgrounded and re-armed on resume.
Layout
| Path | What |
|---|---|
| src/NativeFecoNfcScan.ts | codegen spec → NativeFecoNfcScanSpec |
| android/…/NfcScanModule.java | enableReaderMode, UID hex, event emit |
| android/…/NfcScanPackage.java | BaseReactPackage, TurboModule registration |
| index.js | public API + rescan dedupe |
Not included
Card writing — MIFARE Classic Crypto-1 and DESFire AES-128 boarding stamps
(NfcCardWriter / DesfireCardWriter). Those need key distribution and
synchronous transceive; add them inside NfcScanModule.onTagDiscovered, which
already runs on the NFC binder thread with the channel open.
Test
npm test # JS: dedupe, missing-native guard
./gradlew :feco-nfc-scan:test # Java: UID hex encodingLicense
Copyright 2026 FECO. Apache-2.0 — see LICENSE.
Developed by Sofiane Khoudour.
