Flutter应用Android13下NFC Manager锁Tag崩溃及权限拒绝问题
Flutter NFC Manager 锁定NFC标签在Android 13崩溃问题解决
可能的原因及解决方案
1. 缺失Android 13要求的NFC写入权限
Android 10(API 29)及以上版本中,WRITE_NFC属于危险权限,必须通过动态权限请求获取。Android 13对权限校验更加严格,若未获取该权限,执行标签锁定这类写入操作会触发权限拒绝错误,进而导致应用崩溃。
- 先在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.WRITE_NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> - 在代码中动态请求
WRITE_NFC权限:
务必确保调用标签锁定方法前,该权限已被用户授予。import 'package:permission_handler/permission_handler.dart'; // 启动NFC操作前调用此方法 Future<bool> requestNfcWritePermission() async { final status = await Permission.writeNfc.request(); return status.isGranted; }
2. NFC会话生命周期处理不当
Android 13对NFC会话的连接稳定性要求更高,若在锁定标签前会话已意外断开,会导致操作无响应并触发崩溃。
- 确保调用锁定方法时,标签处于活跃连接状态:
await NfcManager.instance.startSession( onDiscovered: (NfcTag tag) async { // 先验证标签连接有效性 final isConnected = await tag.isConnected(); if (!isConnected) { await NfcManager.instance.stopSession(errorMessage: '标签连接已断开'); return; } // 执行锁定操作 try { // 以NDEF标签为例调用锁定方法 final ndef = Ndef.from(tag); if (ndef != null && ndef.isWritable) { await ndef.lock(); await NfcManager.instance.stopSession(); } } catch (e) { await NfcManager.instance.stopSession(errorMessage: '锁定失败: $e'); } }, ); - 避免在异步操作中提前结束NFC会话,必须等锁定操作完成后再调用
stopSession。
3. 升级NFC Manager插件至最新版本
插件可能已针对Android 13的兼容性问题发布修复版本,检查并升级nfc_manager依赖:
在pubspec.yaml中更新版本:
dependencies: nfc_manager: ^最新版本号
执行flutter pub get完成升级后重新测试。
日志分析说明
日志中的failed to attach to thread 641: Permission denied是崩溃后的调试工具权限问题,核心原因是应用执行NFC锁定操作时权限不足或会话异常,导致应用无响应触发系统信号(Signal 3)进而崩溃。
内容的提问来源于stack exchange,提问作者Rahul Singh
相关产品推荐
相关产品推荐

