WebUSB verwenden

Die WebUSB API stellt nicht standardmäßige Universal Serial Bus (USB)-kompatible Geräte für das Web bereit. Auf dieser Seite werden Aspekte der API beschrieben, die speziell für Erweiterungen gelten. Weitere Informationen zur WebUSB API finden Sie unter 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 Erweiterungs-Service-Workern verwendet werden. Einzelheiten finden Sie im nächsten Abschnitt.

Wenn diese API in einem Erweiterungs-Service-Worker verwendet wird, hält die Geräteverbindungssitzung den Service-Worker aktiv.

Unterschiede bei Chrome-Erweiterungen

WebUSB ist zwar für Erweiterungs-Service-Worker verfügbar, WebUSB.requestDevice(), das ein Versprechen zurückgibt, das in eine USBDevice-Instanz aufgelöst wird, kann jedoch nicht in einem Erweiterungs-Service-Worker aufgerufen werden. Sie können dieses Problem umgehen, indem Sie requestDevice() von einer anderen Erweiterungsseite als dem Erweiterungs-Service-Worker aufrufen und eine Nachricht an den Erweiterungs-Service-Worker senden.

Der folgende Code folgt einem typischen Muster, indem requestDevice() im Rahmen eines Berechtigungsablaufs aufgerufen wird, der eine Nutzergeste erfordert. Nach Erhalt des Geräts 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();
    }
  }
});