You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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功能。

内容的提问来源于stack exchange,提问作者Tuấn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:31:07