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

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方法申请权限,同时注册广播接收器接收权限授予结果,拿到权限后再执行摄像头开启逻辑,示例代码如下:
    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);
    
    注意:安卓12及以上版本PendingIntent必须指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:27:02