Die WebUSB API macht nicht standardmäßige USB-kompatible Geräte im Web verfügbar. Auf dieser Seite werden Aspekte der API beschrieben, die speziell für Erweiterungen gelten. Ausführliche Informationen zur WebUSB API finden Sie auf MDN.
Verfügbarkeit in Erweiterungen
Chrome 118 oder höher
Berechtigungen
Es sind keine Berechtigungen für Manifestdateien erforderlich. WebUSB löst jedoch den Nutzerberechtigungsablauf des Browsers aus.
Manifest
Für diese API sind keine Manifestschlüssel erforderlich.
Unterstützende Kontexte
Diese API kann in fast jedem Kontext verwendet werden. Die Methode WebUSB.requestDevice() kann nicht in Service Workern von Erweiterungen verwendet werden. Einzelheiten finden Sie im nächsten Abschnitt.
Wenn diese API in einem Erweiterungs-Service Worker verwendet wird, wird der Service Worker durch die Verbindungssitzung des Geräts aktiv gehalten.
Unterschiede bei Chrome-Erweiterungen
Obwohl WebUSB für Erweiterungs-Service-Worker verfügbar ist, kann WebUSB.requestDevice(), das ein Promise zurückgibt, das mit einer USBDevice-Instanz aufgelöst wird, nicht in einem Erweiterungs-Service-Worker aufgerufen werden. Um dieses Problem zu umgehen, rufen Sie requestDevice() von einer anderen Erweiterungsseite als dem Erweiterungs-Service-Worker auf und senden Sie eine Nachricht an den Erweiterungs-Service-Worker.
Der folgende Code folgt einem typischen Muster, indem requestDevice() als Teil eines Berechtigungsablaufs aufgerufen wird, für den eine Nutzergeste erforderlich ist. Wenn das Gerät erworben wird, wird eine Nachricht an den Service Worker gesendet, der das Gerät dann mit getDevices() abrufen kann.
popup.js:
myButton.addEventListener("click", async () => {
await navigator.usb.requestDevice({
filters: [{ vendorId: 0x1234, productId: 0x5678 }],
});
chrome.runtime.sendMessage("newDevice");
});
service-worker.js
chrome.runtime.onMessage.addListener(async (message) => {
if (message === "newDevice") {
const devices = await navigator.usb.getDevices();
for (const device of devices) {
// open device connection.
await device.open();
}
}
});