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

Flutter使用nfc_manager读写NFC标签时遇PlatformException(io_exception)错误

Flutter NFC读写PlatformException(io_exception)排查与解决

核心排查方向

  • 标签类型兼容性验证
    nfc_manager对不同NFC标签技术(如NDEF、Mifare Classic)支持逻辑不同,先通过标签的techList确认支持的技术:

    print(tag.techList); // 输出示例:[NfcA, Ndef]
    

    如果标签不支持NDEF,不能直接用Ndef相关API读写,需调用对应技术的操作方法。

  • 权限与会话时机校验

    1. 除了AndroidManifest权限,Android 10+需运行时请求NFC权限:
      import 'package:permission_handler/permission_handler.dart';
      
      Future<void> requestNfcPermission() async {
        final status = await Permission.nfc.request();
        if (!status.isGranted) {
          // 提示用户前往设置开启权限
        }
      }
      
    2. 确保所有读写操作都在NfcManager.instance.startSession的onDiscovered回调内执行,外部异步调用会因会话关闭触发IO异常。
    3. 确认AndroidManifest配置完整:
      <uses-feature android:name="android.hardware.nfc" android:required="true" />
      <uses-permission android:name="android.permission.NFC" />
      <intent-filter>
          <action android:name="android.nfc.action.NDEF_DISCOVERED" />
          <category android:name="android.intent.category.DEFAULT" />
          <data android:mimeType="text/plain" />
      </intent-filter>
      
  • 读写逻辑规范修正
    以NDEF标签为例,必须保证连接的开闭逻辑完整:

    // 读取示例
    Future<String?> readNdef(NfcTag tag) async {
      Ndef? ndef = Ndef.from(tag);
      if (ndef == null || !ndef.isWritable) return null;
      try {
        await ndef.connect();
        final message = await ndef.read();
        return utf8.decode(message.records.first.payload.sublist(3)); // 处理NDEF文本记录的前缀
      } catch (e) {
        rethrow;
      } finally {
        await ndef.close(); // 必须执行关闭
      }
    }
    
    // 写入示例
    Future<void> writeNdef(NfcTag tag, String content) async {
      Ndef? ndef = Ndef.from(tag);
      if (ndef == null || !ndef.isWritable) throw Exception("标签不支持NDEF或不可写");
      try {
        await ndef.connect();
        final record = NdefRecord.createText(content);
        await ndef.write(NdefMessage([record]));
      } catch (e) {
        rethrow;
      } finally {
        await ndef.close();
      }
    }
    

    注意:NDEF文本记录的payload前3字节是语言标识前缀,读取时需跳过,否则会出现乱码或解析错误。

  • 设备NFC状态检查
    启动会话前先确认NFC功能已开启:

    Future<bool> checkNfcStatus() async {
      return await NfcManager.instance.isAvailable();
    }
    

    未开启时引导用户前往系统设置启用。

代码自查要点

  • 你的NfcService类中是否在读写操作后强制关闭了NFC连接?未关闭会导致资源占用,触发后续IO异常。
  • 表单写入时是否使用了NdefRecord.createText等标准方法转换数据?直接转UTF8字节会因不符合NDEF格式导致写入失败。
  • 扫描页面的onDiscovered回调内是否存在异步延迟?超时会导致会话失效抛出异常。

内容的提问来源于stack exchange,提问作者Mohammed Elyaakoubi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:32:00