Как определить, предоставлены разрешения микрофона в хроме

Мне бы хотелось узнать, были ли предоставлены разрешения на микрофон на моем сайте при загрузке без фактического запуска примерно следующего:

navigator.webkitGetUserMedia({audio: active}, 
    function(){alert('worked')}, 
    function(){alert('failed')});

Существует ли простой API для определения того, предоставил ли пользователю постоянный доступ к микрофону моему приложению (который работает по https)?

Ответ 1

Обновить

microphone был добавлен в API разрешений

Вы можете надеяться, что это будет доступно из API разрешения, но это не так :(

Возможно, в этой функции это могло бы работать как остальная часть этого:

navigator.permissions.query(
    // { name: 'camera' }
    { name: 'microphone' }
    // { name: 'geolocation' }
    // { name: 'notifications' } 
    // { name: 'midi', sysex: false }
    // { name: 'midi', sysex: true }
    // { name: 'push', userVisibleOnly: true }
    // { name: 'push' } // without userVisibleOnly isn't supported in chrome M45, yet
).then(function(permissionStatus){

    console.log(permissionStatus.state); // granted, denied, prompt

    permissionStatus.onchange = function(){
        console.log("Permission changed to " + this.state);
    }

})

Старый ответ

Единственный способ, которым я вижу это возможным, - это если вы сами отслеживаете это с помощью элемента ключ/значение в localStorage, когда запрашиваете разрешение.

К сожалению, он не уведомляет вас, когда он был изменен

// initialization
if( localStorage.getItem('microphone') === null ){
    // just assume it is prompt
    localStorage.setItem('microphone', 'prompt');
}

// Then somewhere
navigator.getUserMedia({ audio: true }, function (e) {
    // http://stackoverflow.com/q/15993581/1008999
    //
    // In chrome, If your app is running from SSL (https://),
    // this permission will be persistent.
    // That is, users won't have to grant/deny access every time.
    localStorage.setItem("voice_access", "granted");

}, function (err) {
    if (err.name === 'PermissionDismissedError') {
        localStorage.setItem('voice_access', 'prompt')
    }
    if (err.name === 'PermissionDeniedError') {
        localStorage.setItem('voice_access, 'denied')
    }
})

Вы могли бы приложить дополнительные усилия и создать симпатичную небольшую оболочку с этим кодом выше, а также расширить/заменить API разрешения для обработки большего количества имен enum и создать широковещательный API, чтобы сообщать другим вкладкам, когда он изменяется. но зачем делать это так сложно...? LocalStorage нельзя доверять на 100%. его можно изменить где угодно в любое время как с разрешением, так и с очищенным хранилищем

Ответ 2

у вас уже есть метод опроса для проверки разрешений. вот некоторая информация из MDN: https://developer.mozilla.org/en-US/docs/Web/API/Navigator.getUserMedia

и еще несколько: https://developer.mozilla.org/en-US/docs/WebRTC

вот пример:

navigator.getMedia (
// constraints
   {
      video: true,
      audio: true
   },

   // successCallback
   function(localMediaStream) {
      var video = document.querySelector('video');
      video.src = window.URL.createObjectURL(localMediaStream);
      video.onloadedmetadata = function(e) {
         // Do something with the video here.
      };
   },

   // errorCallback
   function(err) {
    console.log("The following error occured: " + err);
   }

);