亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法讓Chrome“忘記”一個設備來測試navigator.usb.requestDevice

有沒有辦法讓Chrome“忘記”一個設備來測試navigator.usb.requestDevice

HUX布斯 2023-10-14 16:00:58
我希望從使用WebUSB遷移到SerialAPI (這里有很好的解釋)。當前代碼: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 我能夠自動彈出連接窗口。
查看完整描述

3 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

對于這兩個 API,如更新中所述,需要用戶手勢才能調用requestDevice()orrequestPort()方法。無法自動彈出此提示。(如果存在錯誤,請告知 Chrome 團隊,以便我們修復它。)

通過 WebUSB API 和 Web Serial API 授予站點的權限目前是單獨跟蹤的,因此通過其中一個 API 訪問設備的權限不會自動轉換為另一個權限。

目前還沒有一種方法可以通過編程忘記設備權限。這將需要navigator.permissions.revoke()方法,該方法已被放棄。不過,您可以在訪問網站時單擊地址欄中的“鎖定”圖標或轉至 chrome://settings/content/usbDevices(適用于 USB 設備)和 chrome://settings/,手動撤銷訪問設備的權限。 content/serialPorts(用于串行端口)。


查看完整回答
反對 回復 2023-10-14
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

要讓 Chrome“忘記”之前通過 navigator.usb.requestDevice API 配對的 WebUSB 設備:

  1. 打開與您想要忘記的設備配對的頁面

  2. 單擊地址欄中的圖標

  3. 單擊設備旁邊的 x。如果未列出任何內容,則表明該網頁沒有配對的設備。

https://img1.sycdn.imooc.com/652a4b060001cf1c07340635.jpg

查看完整回答
反對 回復 2023-10-14
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

新代碼不起作用。這似乎是因為 Chrome 已經通過舊代碼與該端口配對?!靶麓a”不可能起作用,因為正如 Kalido 的評論中指出的那樣,SerialAPI(由于其強大功能)需要用戶手勢才能連接。


我用來實際連接和獲取數據的代碼基本上是由OP中上述鏈接的幾個部分構建的:


navigator.serial.addEventListener('connect', e => {

  // Add |e.target| to the UI or automatically connect.

  console.log("connected");

});


navigator.serial.addEventListener('disconnect', e => {

  // Remove |e.target| from the UI. If the device was open the disconnection can

  // also be observed as a stream error.

  console.log("disconnected");

});


console.log(navigator.serial);


document.addEventListener('DOMContentLoaded', async () => {


    const connectButton = document.querySelector('#connect') as HTMLInputElement;


    if (connectButton) {

        connectButton.addEventListener('click', async () => {

            try {

        

                // Request Keiser Receiver from the user.

                const port = await navigator.serial.requestPort({

                    filters: [{ usbVendorId: 0x2341, usbProductId: not_required }]

                });

            

                try {

                    // Open and begin reading.

                    await port.open({ baudRate: 115200 });

                

                } catch (e) {

                    console.log(e);

                }

                while (port.readable) {

                  const reader = port.readable.getReader();


                  try {

                    while (true) {

                      const { value, done } = await reader.read();

                      if (done) {

                        // Allow the serial port to be closed later.

                        reader.releaseLock();

                        break;

                      }

                      if (value) {

                        console.log(value);

                      }

                    }

                  } catch (error) {

                    // TODO: Handle non-fatal read error.

                    console.log(error);

                  }

                }

            } catch (e) {

              console.log("Permission to access a device was denied implicitly or explicitly by the user.");

              console.log(e);

              console.log(port);

            }

        }

}

設備特定的供應商和產品 ID 顯然會因設備而異。在上面的示例中,我插入了 Arduino 供應商 ID。


它沒有回答如何讓 Chrome“忘記”的問題,但我不確定這在使用 SerialAPI 時是否相關,因為需要手勢。


希望有更多經驗的人能夠發布更豐富的答案。


查看完整回答
反對 回復 2023-10-14
  • 3 回答
  • 0 關注
  • 537 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號