WebUSB的USBDevice.configurations在Mac和Android平台表现差异问询
问题成因
- Chrome for Android 91版本的WebUSB实现存在权限前置限制:桌面端Chrome允许在
requestDevice完成设备选择后直接读取配置项,但Android端Chrome要求必须先获取Android系统级USB Host访问权限、且完成device.open()调用后才会填充configurations属性,未完成权限授予和设备打开前该属性默认返回空数组。 - Android系统对USB打印机类(USB Class 0x07)设备存在默认接管逻辑:部分Android系统会默认将匹配到的USB打印机设备分配给系统打印服务,没有释放设备访问权限给第三方应用(包括Chrome浏览器),导致WebUSB无法读取设备配置参数。
- Chrome 91 for Android存在已知的WebUSB配置枚举漏洞,该版本对部分厂商的USB设备描述符解析逻辑存在缺陷,会偶发配置读取失败的问题。
可行解决方案
- 调整代码执行顺序,拿到设备对象后先触发open操作再读取配置,示例代码如下:
const device = await navigator.usb.requestDevice({ filters: [{}] }); // 执行open操作会触发Android系统USB权限申请弹窗,用户授权后即可拿到设备控制权 await device.open(); // 此时读取配置项即可获取到正常返回值 console.log(device.configurations);
- 调整Android系统打印服务设置,进入「设置 - 连接的设备 - 打印服务」,关闭系统默认打印服务对CITIZEN CT-E651打印机的自动接管,释放设备控制权。
- 将移动端Chrome浏览器升级到92及以上版本,Chrome 92已修复91版本存在的WebUSB配置枚举漏洞。
- 优化设备筛选规则,在
requestDevice参数中指定打印机类和对应厂商ID,提升设备识别准确性,避免权限冲突:
const device = await navigator.usb.requestDevice({ filters: [{ classCode: 0x07, // USB打印机类标准分类码 vendorId: 0x0483 // 可替换为CITIZEN CT-E651的实际厂商ID }] });
内容的提问来源于stack exchange,提问作者Wouter Raateland
相关产品推荐
相关产品推荐

