使用WebUSB与Flutter连接设备时遇claimInterface调用失败问题
解决WebUSB调用
claimInterface失败的问题 针对你遇到的NetworkError: Failed to execute 'claimInterface' on 'USBDevice': Unable to claim interface错误,下面是具体的排查和解决方法:
常见原因及解决步骤
接口被其他进程占用
你的代码用于连接ADB设备,而电脑上的ADB服务(adb进程)通常会自动抢占设备的USB接口。先关闭ADB服务再尝试连接:adb kill-server关闭后重新运行WebUSB代码,避免接口被ADB进程占用。
配置或接口号不正确
并非所有设备的默认配置都是1、接口都是0。在调用selectConfiguration前,先打印设备的配置信息确认实际参数:async function requestADBDevice() { try { const device = await navigator.usb.requestDevice({ filters: [] }); await device.open(); // 打印设备所有配置,确认正确的配置索引和接口号 console.log('设备配置信息:', device.configurations); // 根据打印结果修改配置和接口号,比如部分设备配置是0 await device.selectConfiguration(1); await device.claimInterface(0); console.log('Device connected:', device); window.adbDevice = device; return device; } catch (error) { console.error('Error: ' + error); } }比如部分设备的ADB接口可能是
1,需要对应修改claimInterface的参数。接口已被当前页面占用未释放
如果之前连接过设备但未正确释放接口,再次连接会失败。可以在claim前检查并释放接口:async function requestADBDevice() { try { const device = await navigator.usb.requestDevice({ filters: [] }); await device.open(); await device.selectConfiguration(1); // 检查接口是否已被占用,若占用则先释放 if (device.interfaces[0].claimed) { await device.releaseInterface(0); } await device.claimInterface(0); console.log('Device connected:', device); window.adbDevice = device; return device; } catch (error) { console.error('Error: ' + error); } }设备权限或兼容性问题
确保使用的浏览器支持WebUSB(如Chrome、Edge),设备已开启USB调试模式,并且浏览器已获得设备的访问授权。部分厂商的设备可能需要额外的驱动或设置才能被WebUSB识别。
内容的提问来源于stack exchange,提问作者mohammed_sajid
相关产品推荐
相关产品推荐

