Flutter升级targetSDK至34后USB串口权限异常问题
解决Target SDK 34下usb_serial权限异常问题
核心原因
Android 14(API 34)对USB设备访问权限机制做了调整,旧版usb_serial: ^0.5.1未适配该变化,导致权限请求流程失效,触发SecurityException。
具体修复步骤
1. 修正Manifest权限声明
在AndroidManifest.xml中补充或确认以下权限配置:
<!-- USB设备访问权限 --> <uses-permission android:name="android.permission.USB_PERMISSION" /> <!-- Android 14新增:若需持续访问USB设备需声明前台服务权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_USB" />
2. 适配API 34的权限请求逻辑
Android 14要求PendingIntent必须指定FLAG_IMMUTABLE或FLAG_MUTABLE,旧版usb_serial的权限请求代码未处理该要求,导致弹窗不触发。
如果暂时无法升级包,可通过原生MethodChannel补充适配逻辑(示例原生代码):
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); UsbDevice targetDevice = ...; // 目标USB设备 // 构造符合API34要求的PendingIntent PendingIntent permissionIntent = PendingIntent.getBroadcast( this, 0, new Intent("com.your.app.USB_PERMISSION"), PendingIntent.FLAG_IMMUTABLE ); usbManager.requestPermission(targetDevice, permissionIntent);
3. 升级usb_serial到适配版本
优先检查usb_serial包的最新版本,若已有适配API34的更新(如^0.6.0及以上,需确认官方发布说明),直接更新pubspec.yaml:
dependencies: usb_serial: ^最新适配版本号
如果暂无官方适配,可考虑:
- Fork仓库自行修改权限请求逻辑,补上
PendingIntent的flag配置 - 更换已适配API34的替代USB串口包
4. 验证权限流程
在Flutter层确保权限请求逻辑正确:
UsbSerial usbSerial = UsbSerial(); List<UsbDevice> devices = await usbSerial.listDevices(); if (devices.isNotEmpty) { bool hasPermission = await usbSerial.hasPermission(devices.first); if (!hasPermission) { bool granted = await usbSerial.requestPermission(devices.first); if (granted) { // 权限授予成功,执行设备操作 } } }
验证方案
将Target SDK设为34重新编译运行:
- 确认权限请求弹窗正常弹出
- 授予权限后USB设备可正常访问,无
SecurityException抛出
内容的提问来源于stack exchange,提问作者Sawan Bhardwaj
相关产品推荐
相关产品推荐

