1

我正在为必须与特定 USB 设备通信的 chromebook 编写应用程序。该设备存在于找到的设备列表中,来自回调:

   var VENDOR_ID = 5824, PRODUCT_ID = 1159;

   document.getElementById("request-permission").addEventListener('click', function() {
    chrome.permissions.request({
            permissions: [{
                'usbDevices': [{
                    'vendorId': VENDOR_ID,
                    "productId": PRODUCT_ID
                }]
            }]
        },
        function(result) {
            if (result) {
                console.log('App was granted the "usbDevices" permission.');
                getDevices();
            }
        }
    });
});


function getDevices() {
    chrome.usb.getDevices({
        vendorId: VENDOR_ID,
        productId: PRODUCT_ID
    }, function(devices) {
        if (chrome.runtime.lastError !== undefined) {
            console.warn('chrome.usb.getDevices error: ' + chrome.runtime.lastError.message);
            return;
        }
        if (devices) {
            if (devices.length > 0) {
                for (var device of devices)
                    openUsbDevice(device);
            }
        }
    }); 
}

所以我可以成功看到我的设备,但是当我尝试打开它时,它失败了:

chrome.usb.openDevice(device, function(handle) {
        if (chrome.runtime.lastError != undefined) {
          console.log('Failed to open device: '+chrome.runtime.lastError.message);
        } else {
          populateDeviceInfo(handle, function () {
              chrome.usb.closeDevice(handle);
            });
        }
      });

我在控制台中收到错误:无法打开设备:访问设备的权限被拒绝

我在 manifest.js 中声明了所有必需的 USB 权限:

  "permissions" : [
    "usb"
  ],
  "optional_permissions" : [{
    "usbDevices" : [
        {
          "productId" : 1159,
          "vendorId" : 5824
        }
      ]
  }],

我还尝试了其他 api 函数,例如chrome.usb.findDeviceschrome.usb.requestAccess,但结果是一样的。同时我的nexus 7 设备例如通过usb 被成功识别。任何想法为什么可以或猜测如何使我的 USB 设备变得可访问?我只在 Acer Chromebook c7 (Chrome OS v.44) 上遇到过这个问题,而在 Mac 上我没有这样的问题。

4

1 回答 1

2

打开 chrome://system 并展开“syslog”部分。对于您尝试打​​开的每个设备,您会发现来自“permission_broker”的一系列消息以及导致它拒绝访问的规则。

最常见的原因是“DenyClaimedUsbDeviceRule”拒绝访问由另一个应用程序或内核驱动程序声明的设备。在这种情况下,出于安全原因拒绝访问。Chrome 操作系统不希望 Chrome 应用能够覆盖通常由内核对其支持的设备强制执行的任何策略。您应该使用更高级别的 API(例如用于存储设备的 chrome.fileSystem 或用于网络摄像头和音频适配器的 navigator.getUserMedia)。

于 2015-09-02T15:14:20.340 回答