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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:11:01