关闭USB调试时用WebUSB连接安卓手机报错DOMException Acces denied
问题根因
你遇到的DOMException Access denied错误是安卓系统USB权限管控的正常拦截逻辑,和你的代码逻辑无关,核心原因如下:
- USB调试关闭状态下,安卓系统默认拒绝所有未授权主机端发起的USB设备打开请求,仅允许MTP/PTP等系统预设的标准USB功能连接,不会开放自定义USB接口访问权限
- USB音频这类标准USB设备类有系统默认的访问授权,WebUSB调用时不需要额外的特殊权限,所以不会触发报错;而安卓手机作为USB设备时,默认暴露的接口均为系统管控专属接口,未授权状态下禁止第三方应用(包括浏览器的WebUSB API)直接打开
实现需求的必要步骤
你的核心诉求是PC端通过WebUSB访问安卓手机的USB接口,需要完成以下前置配置和代码优化:
安卓侧配置(必做,无绕过方案)
- 必须开启安卓设备的「USB调试」开关,路径一般是「设置-开发者选项-USB调试」(开发者选项需要先连续点击系统版本号5次激活)
- 安卓设备连接PC后,在弹出的「允许来自这台计算机的USB调试」授权弹窗中点击确认,部分机型还需要将USB用途切换为「文件传输(MTP)」或者「USB配件」模式
代码优化
你的现有代码中requestDevice的过滤参数为空,会导致不同操作系统的权限校验逻辑异常,建议补充你要连接的安卓设备的VID(厂商ID)和PID(产品ID)过滤:
let device = null let configValue = 0 let interfaceValue = 0 const connect = async() => { try { device = await navigator.usb.requestDevice({ // 替换为你目标安卓设备的实际VID和PID,可在设备管理器/系统报告中查询 filters : [ { vendorId: 0xXXXX, productId: 0xYYYY } ] }); await device.open() if(device.configurations.length > 0){ configValue = device.configuration.configurationValue interfaceValue = device.configuration.interfaces[0].interfaceNumber await device.selectConfiguration(configValue) await device.claimInterface(interfaceValue) } console.log(device); } catch (error) { console.log(error); } }
系统侧额外配置(Windows环境必做)
Windows系统下默认不会给安卓设备分配WebUSB需要的WinUSB驱动,你需要使用Zadig工具,给目标安卓设备更换驱动为WinUSB版本后再进行连接测试,macOS和Linux环境无需额外配置驱动。
浏览器环境要求
WebUSB API仅在HTTPS域名或者localhost本地调试环境下可用,非上述环境中浏览器会直接禁用API调用权限,也会触发访问拒绝报错。
内容的提问来源于stack exchange,提问作者Alok Prakash
相关产品推荐
相关产品推荐

