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

使用flutter_libserialport 0.3.0在Android 12遇权限拒绝错误求助

Android 12 下 flutter_libserialport 权限拒绝(errno=13)解决办法

1. 配置Manifest静态权限

在android/app/src/main/AndroidManifest.xml中添加必要权限:

<!-- 基础存储与定位权限(部分设备串口访问依赖) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12+ 专属USB管理权限 -->
<uses-permission android:name="android.permission.MANAGE_USB" />
<uses-feature android:name="android.hardware.usb.host" android:required="false" />

2. 动态申请危险权限

Android 12对危险权限要求动态申请,在Flutter初始化串口前加入权限请求逻辑:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestRequiredPermissions() async {
  // 请求存储权限
  var storageStatus = await Permission.storage.request();
  if (!storageStatus.isGranted) return;
  
  // 请求定位权限(部分设备串口访问依赖)
  var locationStatus = await Permission.location.request();
  if (!locationStatus.isGranted) return;
}

3. USB串口设备权限处理

如果使用的是USB转串口设备,需额外配置:

  1. 在AndroidManifest.xml中注册USB广播接收器:
<receiver android:name=".UsbReceiver">
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
    <meta-data 
        android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
        android:resource="@xml/usb_device_filter" />
</receiver>
  1. 在android/app/src/main/res/xml目录新建usb_device_filter.xml,添加你的设备ID(可通过adb shell dumpsys usb查看):
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="XXXX" product-id="XXXX" />
    <!-- 可添加多组设备ID适配不同硬件 -->
</resources>
  1. 在Flutter代码中请求设备访问权限:
import 'package:flutter_libserialport/flutter_libserialport.dart';

void checkAndRequestPortPermission(String portPath) {
  var port = SerialPort(portPath);
  if (!port.openReadWrite()) {
    if (SerialPort.lastError == 13) {
      SerialPort.requestPermission(portPath);
    }
  }
}

4. 调试阶段临时处理SELinux限制

部分设备的SELinux会拦截串口访问,调试时可通过adb临时关闭:

adb shell setenforce 0

注意:正式发布不建议这么做,需联系设备厂商开放权限或适配SELinux规则。

5. 检查串口设备文件权限

通过adb查看串口设备路径(如/dev/ttyUSB0)的权限:

adb shell ls -l /dev/ttyUSB0

若权限不足,root设备后修改权限:

adb shell chmod 666 /dev/ttyUSB0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:20