使用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转串口设备,需额外配置:
- 在
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>
- 在
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>
- 在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
相关产品推荐
相关产品推荐

