Обнаружить снятие ограничения устройств - PullRequest
1 голос
/ 06 апреля 2020

Использование getUserMedia , чтобы позволить пользователю выбрать микрофон. Далее я использую enumerateDevices для создания выбора с устройствами, чтобы пользователь мог сменить устройство с пользовательского интерфейса.

Я на Firefox и не проверял, как другие браузеры плата за проезд, но по крайней мере для FF я не нашел решения.

Если пользователь выбирает запретить доступ при запросе, он не получает запрос снова [1] , пока пользователь не снимет ограничение :

enter image description here

Вопрос в том, есть ли способ определить, когда пользователь снимает ограничение?

Сценарий, как правило:

  1. Пользователь загружает страницу и ему предлагается выбрать устройство ввода
  2. Пользователь отклоняет

    UI disables device selector + hide various stuff
    
  3. Пользователь снимает ограничение (как показано на рисунке выше) )

    UI enables device selector + unhide various stuff
    

Нет (очевидно) способа сброса блока со стороны клиента с помощью Java скрипта, но есть ли способ обнаружить, что пользователь отзывает блок? (Или есть? Похоже, что-то, что можно было бы использовать для продолжения цикла запроса на доступ.)

Можно сделать все oop, где каждый продолжает пытаться на протяжении жизни страницы, но хотел бы избежать который. Ищите событие для этого.

В связи с этим, ondevicechange , не вызывает событие при удалении блока - что логично, так как в доступном нет изменения устройства, в некотором смысле: P.


[1] То есть: можно спросить, но это приведет к:

MediaStreamError
сообщение: Запрос не разрешен агентом пользователя или платформой в текущем контексте.
name: NotAllowedError

1 Ответ

1 голос
/ 06 апреля 2020

Вы должны быть в состоянии обнаружить это изменение с помощью Разрешения API .

Объект PermissionStatus , возвращаемый Permissions.prototype.query(), имеет onchange обработчик событий. Таким образом, запрос к "camera" или "microphone" вызовет событие изменения, когда пользователь изменит свои настройки.

const camera_perm = await navigator.permissions.query( { name: 'camera' } );
camera_perm.onchange = (evt) => {
  const allowed = camera_perm.state === "granted";
  if( allowed ) {
    // ...
  }
  else {

  }
};

В настоящее время работает в Chrome, но Firefox по-прежнему не поддерживает ни "camera", ни "microphone" членов PermissionDescriptor . Таким образом, для этого браузера самое близкое, что мы можем иметь, - это опрос, как объясняется в этом вопросе / ответе: Слушатель событий, которому разрешено "заблокировать камеру и микрофон" .

...