Не удалось подключиться к USB на Chromebook: в доступе к устройству отказано

Я пишу приложение для Chromebook, которое должно общаться с конкретным устройством USB. Устройство присутствует в списке найденных устройств, который поступает от обратного вызова:

   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);
            });
        }
      });

И я получаю сообщение об ошибке в консоли: Не удалось открыть устройство: в доступе к устройству было отказано

У меня есть все необходимые разрешения USB, объявленные в manifest.js:

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

Я также пробовал другие функции API, такие как chrome.usb.findDevices и chrome.usb.requestAccess, но результат тот же. В то же время мое устройство Nexus 7, например, успешно распознается через USB. Любые идеи, почему это может быть или угадывает, как сделать мое USB-устройство доступным? Я сталкивался с этим только на Acer Chromebook c7 (Chrome OS v.44) и на Mac, у меня не было такой проблемы.

1 ответ

Решение

Откройте chrome://system и раскройте раздел "syslog". Вы найдете серию сообщений от "license_broker" для каждого устройства, которое вы пытаетесь открыть, и правила, которое заставило его запретить доступ.

Наиболее распространенной причиной является "DenyClaimedUsbDeviceRule", который запрещает доступ к устройствам, на которые претендует другое приложение или драйвер ядра. В этом случае доступ запрещен по соображениям безопасности. Chrome OS не хочет, чтобы приложение Chrome могло переопределять любые политики, обычно применяемые ядром для устройств, которые оно поддерживает. Вы должны использовать API более высокого уровня (например, chrome.fileSystem для устройств хранения данных или navigator.getUserMedia для веб-камер и аудиоадаптеров).

Другие вопросы по тегам