【发布时间】:2020-12-05 00:00:00
【问题描述】:
我希望从使用 WebUSB 迁移到 SerialAPI(很好地解释了 here)。
当前代码:
try {
let device = await navigator.usb.requestDevice({
filters: [{
usbVendorId: RECEIVER_VENDOR_ID
}]
})
this.connect(device)
} catch (error) {
console.log(DEVICE_NAME + ': Permission Denied')
}
新代码:
try {
let device = await navigator.serial.requestPort({
filters: [{
usbVendorId: RECEIVER_VENDOR_ID
}]
})
this.connect(device)
} catch (error) {
console.log(DEVICE_NAME + ': Permission Denied')
}
新代码似乎可以工作,但我认为这是因为浏览器已经通过旧代码请求了设备。
我已尝试重新启动 Chrome 并清除所有浏览历史记录。甚至关闭了 USB 声明页面并使用另一个应用程序声明了该设备(在此期间它返回 DOMException: Unable to claim interface 错误),但 Chrome 似乎不想再次询问。它只是愉快地使用先前的连接流式传输数据。
我希望使用 SerialAPI 可以避免与其他进程争夺 USB,或者至少输给他们。
更新
我忘记了:
Failed to execute 'requestPort' on 'Serial': "Must be handling a user gesture to show a permission request"
这是否意味着用户需要使用按钮通过 SerialUSB 连接到设备?我认为使用 WebUSB 可以让连接窗口自动弹出。
【问题讨论】:
-
您收到的消息确切意味着您应该从事件中发出请求,通过用户手势实例化(点击即可)。
-
谢谢@Kaiido。在更新中,我想知道是否有必要通过用户手势实例化请求,我认为 WebUSB 不是这种情况。
-
来自您自己的链接:web.dev/usb/#user-gesture-required
-
哎呀。我猜 SerialAPI 是一种不同的动物(来自 WebUSB)。我还认为手势要求使 OP 如何“忘记”设备静音。我可以继续删除这个问题。
标签: javascript webusb serialapi