如何在Flutter应用中读取日本Felica卡数据?
Flutter读取Felica卡数据实操指导
核心依赖选择
优先使用flutter_nfc_kit包,它支持跨平台NFC操作,兼容Felica标准。在pubspec.yaml中添加依赖:dependencies: flutter_nfc_kit: ^3.3.0平台配置
Android 端
在AndroidManifest.xml中添加权限与NFC过滤规则:<!-- NFC权限声明 --> <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> <!-- 在对应activity下添加NFC捕获规则 --> <activity ...> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> </activity>在
res/xml目录创建nfc_tech_filter.xml文件,指定Felica技术类型:<resources> <tech-list> <tech>android.nfc.tech.NfcF</tech> </tech-list> </resources>iOS 端
在Info.plist中添加权限描述与允许的Felica系统码:<key>NFCReaderUsageDescription</key> <string>需要读取Felica卡数据</string> <key>com.apple.developer.nfc.readersession.felica.systemcodes</key> <array> <string>FFFF</string> <!-- 通用系统码,可替换为目标卡的特定系统码,如Suica的8000 --> </array>同时在Xcode中开启
Near Field Communication Tag Reading能力(项目配置 -> Signing & Capabilities -> 添加Capability)。
基础读卡实现代码
以下是核心读卡逻辑,包含NFC可用性检查、Felica卡识别与基础数据读取:import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; Future<void> readFelicaCard() async { try { // 检查设备NFC状态 final nfcStatus = await FlutterNfcKit.nfcAvailability; if (nfcStatus != NFCAvailability.available) { print("NFC不可用,请检查设备是否支持或已开启NFC"); return; } // 启动NFC会话,指定Felica系统码 final tag = await FlutterNfcKit.poll( timeout: const Duration(seconds: 10), felicaSystemCodes: ["FFFF"], // 需与iOS配置的系统码一致 ); if (tag.type == NFCTagType.felica) { // 获取Felica卡的核心标识IDm与PMm final idm = tag.id; final pmm = tag.felicaPmm ?? "无PMm数据"; print("Felica卡IDm: $idm"); print("Felica卡PMm: $pmm"); // 示例:发送Felica命令读取特定数据(如Suica余额) // 需根据目标卡的协议文档替换对应指令 final response = await FlutterNfcKit.transceive( tag, "000000000000000000000000", // 替换为实际Felica指令 ); print("指令响应: $response"); } // 结束NFC会话 await FlutterNfcKit.finish(); } catch (e) { print("读卡异常: $e"); await FlutterNfcKit.finish(); } }关键注意事项
- 不同Felica卡对应不同系统码(如Suica为
8000,PASMO为0003),需根据目标卡类型修改配置中的系统码,iOS必须提前声明允许的系统码才能读取。 - 读取卡内具体数据(如余额、交易记录)需要对应卡的官方协议指令,可参考对应运营商的开发者文档(如JR East的Suica开发手册)。
- Android 10+需要动态申请NFC权限,可结合
permission_handler包实现权限申请逻辑。 - 必须使用实体Felica卡测试,模拟器不支持NFC功能。
- 不同Felica卡对应不同系统码(如Suica为
内容的提问来源于stack exchange,提问作者Tuấn
相关产品推荐
相关产品推荐

