银河麒麟浏览器无法调用本地摄像头,根源在于系统级权限未透传、uvcvideo驱动未加载、用户未加入video组或wayland会话下v4l2设备不可见;需依次验证硬件识别(lsusb)、驱动状态(lsmod | grep uvcvideo)、手动加载驱动、添加用户至video组并重新登录、安装配置pipewire服务,并检查浏览器媒体策略设置。

银河麒麟系统中浏览器无法调用本地摄像头,常见于政务办公、在线身份核验、视频会议等场景,用户点击“允许访问摄像头”后仍提示权限被拒或黑屏无响应。问题根源通常不是浏览器本身限制,而是系统级权限未透传、uvcvideo驱动未加载、用户未加入video组,或Wayland会话下V4L2设备路径不可见。
确认摄像头硬件与驱动状态
先验证底层是否识别设备:打开终端,执行 lsusb | grep -i camera 或 lspci | grep -i video。若无输出,说明BIOS中可能禁用了摄像头,或硬件故障。
运行 lsmod | grep uvcvideo。若无返回,代表USB摄像头驱动未加载;此时执行 sudo modprobe uvcvideo 手动加载。注意:【若系统为ARM架构(如飞腾/鲲鹏平台),部分国产摄像头需专用驱动而非uvcvideo,此命令无效】。
再执行 dmesg | grep -i "video\|uvc",观察是否有 failed to request firmware 或 device not enumerated 类错误——这表示固件缺失或USB枚举失败,需联系厂商提供对应firmware并放入 /lib/firmware 目录。
授予用户对视频设备的读写权限
银河麒麟默认不将普通用户加入 video 组,导致浏览器沙箱进程无法打开 /dev/video0。
执行命令添加当前用户:sudo usermod -aG video $USER。
该操作生效需【注销当前桌面会话并重新登录】,仅重启终端无效。未执行此步,Chrome/Firefox/Edge均会静默拒绝访问,控制台报错 NotAllowedError: Permission denied 且无明确提示。
检查Wayland会话兼容性
银河麒麟V10默认使用Wayland会话,而多数浏览器(尤其是Chromium系)在Wayland下无法直接访问V4L2设备,必须通过PipeWire中介服务。
第一步:确认当前会话类型,运行 loginctl show-session $(loginctl | grep current | awk '{print $1}') -p Type,输出应为 Type=wayland。
第二步:安装PipeWire及适配组件:sudo apt install pipewire pipewire-pulse pipewire-alsa pipewire-v4l2。
第三步:重启PipeWire服务:systemctl --user restart pipewire pipewire-pulse pipewire-v4l2。这一步完成后,/dev/video0 将被PipeWire虚拟化为 /dev/video0 的代理节点,浏览器才能安全调用。
浏览器端强制启用摄像头策略
方法一:Chrome/Edge系浏览器
在地址栏输入 chrome://flags/#unsafely-treat-insecure-origin-as-secure,将该实验性开关设为 Enabled,并在下方 --unsafely-treat-insecure-origin-as-secure="http://localhost" 字段填入你的开发地址(如 http://127.0.0.1:3000),重启浏览器。
方法二:Firefox
在地址栏输入 about:config → 搜索 media.navigator.enabled,确保值为 true;再搜索 permissions.default.camera,双击修改为 1(1=允许,2=阻止,0=询问)。
方法三:绕过HTTPS强制要求(仅限内网调试)
启动浏览器时追加参数:google-chrome --unsafely-allow-protected-media --use-fake-ui-for-media-stream --use-fake-device-for-media-stream。此模式下所有媒体请求自动通过,但【仅限测试环境,禁止用于生产或含敏感信息的页面】。
验证是否修复成功
打开 https://www.php.cn/link/f77cf08ee99fa7701632a59db043b925 或运行本地HTML文件,其中包含以下最小代码:
<video id="video" autoplay muted></video><script>navigator.mediaDevices.getUserMedia({video:true}).then(stream => {document.getElementById("video").srcObject = stream;});</script>
若视频画面正常显示,说明全流程打通;若仍黑屏,按顺序回溯:检查 groups 命令输出是否含 video、journalctl --user-unit=pipewire -n 50 是否有ERROR、v4l2-ctl --device /dev/video0 --all 是否能读取设备属性。











