Flutter访问外接USB摄像头报错:用户未授予设备访问权限
User has not given 10404/com.example.monitoramento permission to access device /dev/bus/usb/001/002
以上报错核心是应用未获取到对应USB设备的访问权限,你当前的device_filter.xml已经配置了通用UVC设备规则,只要PID/VID匹配正确就不会出现设备识别失败的问题,可按以下步骤排查解决:
- 检查AndroidManifest.xml配置是否完整
确保已添加USB Host功能声明,且主Activity已关联设备过滤配置、监听USB设备挂载广播,配置示例如下:<!-- 声明应用需要USB Host功能 --> <uses-feature android:name="android.hardware.usb.host" android:required="true" /> <application ...> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <!-- 监听USB设备挂载事件 --> <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/device_filter" /> </activity> </application> - 补充运行时USB权限申请逻辑
原生AndroidUSBCamera项目自带权限申请逻辑,Flutter桥接时如果遗漏该部分会导致权限不足。需要在原生层主动调用UsbManager的requestPermission方法申请权限,同时注册广播接收器接收权限授予结果,拿到权限后再执行摄像头开启逻辑,示例代码如下:
注意:安卓12及以上版本PendingIntent必须指定private static final String ACTION_USB_PERMISSION = "com.example.monitoramento.USB_PERMISSION"; // 注册USB权限授权结果广播 private final BroadcastReceiver usbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (ACTION_USB_PERMISSION.equals(intent.getAction())) { UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && device != null) { // 权限获取成功,执行摄像头开启逻辑 } } } }; // 主动申请USB设备权限逻辑 UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); UsbDevice targetDevice = // 遍历USB设备列表找到对应的UVC摄像头设备 PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE); registerReceiver(usbReceiver, new IntentFilter(ACTION_USB_PERMISSION)); usbManager.requestPermission(targetDevice, permissionIntent);FLAG_IMMUTABLE或FLAG_MUTABLE,否则会抛出异常。 - 确认设备PID/VID配置正确
device_filter.xml中填写的PID、VID必须是十进制数值,很多用户从lsusb等工具查到的是十六进制值,直接填写会导致匹配失败。可通过ADB命令adb shell lsusb查看接入摄像头的VID/PID,转换为十进制后确认是否已添加到device_filter.xml中。 - 检查系统权限授予状态
进入平板系统设置的应用管理页面,找到你的App确认是否已经授予了USB相关权限,如果之前误点了拒绝并勾选"不再询问",需要卸载App重装后重新授权。 - 兼容定制ROM的异常情况
部分国产定制安卓系统不会正常发送USB_DEVICE_ATTACHED广播,可在原生层初始化时主动遍历当前已接入的USB设备,匹配到目标UVC设备后主动触发权限申请,不依赖系统广播触发。
内容的提问来源于stack exchange,提问作者E. Biagi
相关产品推荐
相关产品推荐

