Flutter USB设备访问权限被拒(errno=13)问题求助
解决Flutter USB设备访问权限被拒(errno=13)的问题
1. 修正AndroidManifest.xml权限配置
你当前的权限配置存在错误,android.permission.USB_PERMISSION不属于<uses-permission>声明项,而是需要通过代码动态请求的特殊权限;另外如果你的应用是作为主机连接普通USB设备,应该用android.hardware.usb.host而非accessory。正确配置如下:
<!-- 声明USB主机特性,非强制要求可设为false --> <uses-feature android:name="android.hardware.usb.host" android:required="false" /> <!-- 仅当需要读写外部存储时保留,与USB访问无直接关联 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2. 确保device_filter.xml配置准确
在res/xml/device_filter.xml中必须精准匹配目标USB设备的VID和PID,示例:
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 替换为你的设备实际VID和PID --> <usb-device vendor-id="1234" product-id="5678" /> </resources>
3. 代码中主动触发USB权限请求
仅靠Manifest配置无法弹出权限窗口,必须通过usb_serial包主动请求,示例代码:
import 'package:usb_serial/usb_serial.dart'; Future<void> requestUsbPermission() async { List<UsbDevice> devices = await UsbSerial.listDevices(); if (devices.isNotEmpty) { UsbDevice targetDevice = devices.first; // 发起权限请求 bool isGranted = await UsbSerial.requestPermission(targetDevice); if (isGranted) { // 权限通过后打开设备 UsbPort? port = await targetDevice.create(); await port?.open(); // 根据设备需求设置串口参数 await port?.setParameters(9600, 8, 1, 0); } else { print("USB权限被拒绝"); } } }
4. Android版本适配处理
- 针对Android 10+,若确实需要外部存储权限,需引导用户手动开启(该权限无法通过弹窗直接授权):
import 'package:permission_handler/permission_handler.dart'; Future<void> checkStoragePermission() async { if (await Permission.manageExternalStorage.isDenied) { await Permission.manageExternalStorage.request(); if (await Permission.manageExternalStorage.isDenied) { // 跳转到应用设置页让用户手动开启 await openAppSettings(); } } }
5. 设备连接模式排查
确保USB设备连接时处于主机模式,部分设备需在开发者选项中将USB连接模式调整为“仅充电”或“USB主机”,避免MTP等文件传输模式干扰权限请求。
6. 测试注意事项
- 不要在应用启动时直接请求权限,建议通过按钮点击触发,避免系统拦截权限弹窗;
- 修改配置后重启应用和设备,确保配置生效。
内容的提问来源于stack exchange,提问作者Muaz ALBAGHDADI
相关产品推荐
相关产品推荐

