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读写,需调用对应技术的操作方法。
权限与会话时机校验
- 除了AndroidManifest权限,Android 10+需运行时请求NFC权限:
import 'package:permission_handler/permission_handler.dart'; Future<void> requestNfcPermission() async { final status = await Permission.nfc.request(); if (!status.isGranted) { // 提示用户前往设置开启权限 } } - 确保所有读写操作都在
NfcManager.instance.startSession的onDiscovered回调内执行,外部异步调用会因会话关闭触发IO异常。 - 确认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>
- 除了AndroidManifest权限,Android 10+需运行时请求NFC权限:
读写逻辑规范修正
以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
相关产品推荐
相关产品推荐

