Подтвердить что ты не робот

Reprompt для разрешений с помощью getUserMedia() после первоначального отказа

Как мы можем запросить доступ камеры/микрофона с помощью getUserMedia() после того, как вам отказали?

Я работаю с getUserMedia, чтобы получить доступ к пользовательской камере и передать данные на холст. Этот бит работает отлично.

При тестировании я ударил один раз. На этом этапе в Chrome и Firefox любые последующие запросы с getUserMedia() по умолчанию будут отменены.

Мы, очевидно, не хотим раздражать всех наших пользователей, запрашивая разрешения для камеры/микрофона при каждой загрузке страницы после отказа. Это уже достаточно раздражает геолокацией api.

Однако должен быть способ запросить его снова. Просто из-за того, что пользователь ударил один раз, это не означает, что они хотят отрицать доступ к веб-камерам на все время.

Я читал о спецификациях и искал в течение некоторого времени, но я не нахожу ничего явно об этой проблеме.

Изменить: Дальнейшие исследования показывают, что нажатие кнопки "Запретить" в Chrome добавляет текущий сайт в список блоков. К этому можно обращаться вручную через chrome://settings/content. Перейдите к Media. Управление исключениями, удалите заблокированные сайты.

Ссылка на chrome://настройки/контент не работает (в случае, если мы хотим добавить полезную ссылку, чтобы люди могли повторно разрешить разрешения).

Весь UX для разрешения разрешений вокруг getUserMedia воняет. = (

4b9b3361

Ответ 1

Используйте HTTPS. Когда пользователь дает разрешение один раз, он запоминается, и Chrome не запрашивает разрешения для этой страницы еще раз, и вы сразу получаете доступ к медиа. Это не дает вам возможность снова принудительно активировать панель разрешений пользователя, но, по крайней мере, убедитесь, что вам не нужно запрашивать ее, как только пользователь предоставляет разрешение один раз.

Если ваше приложение работает с SSL (https://), это разрешение будет постоянным. То есть, пользователи не должны каждый раз предоставлять/запрещать доступ.

Смотрите: http://www.html5rocks.com/en/tutorials/getusermedia/intro/

Ответ 2

Ответ jeffreyveon поможет уменьшить вероятность того, что ваш пользователь выберет отрицание, так как ей нужно будет только один раз выбрать.

Если она нажала кнопку "deny", вы можете предоставить сообщение, объясняющее, почему вам нужно разрешение и как обновить ее выбор. Например:

navigator.getUserMedia (
   // 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) {
    if(err === PERMISSION_DENIED) {
      // Explain why you need permission and how to update the permission setting
    }
   }
);

Ответ 3

В Chrome реализован Permissions API в navigator.permissions, который также применяется к разрешениям для camera и microphone.

Итак, на данный момент, перед вызовом getUserMedia(), вы можете использовать этот API для запроса состояния разрешений для вашей камеры и микрофона:

 navigator.permissions.query({name: 'microphone'})
 .then((permissionObj) => {
  console.log(permissionObj.state);
 })
 .catch((error) => {
  console.log('Got error :', error);
 })

 navigator.permissions.query({name: 'camera'})
 .then((permissionObj) => {
  console.log(permissionObj.state);
 })
 .catch((error) => {
  console.log('Got error :', error);
 })

В случае успеха, permissionObj.state возвращает denied, granted или prompt.

Полезный вопрос/ответ по SF здесь

Для кросс-браузерного решения один простой подход может заключаться в отслеживании разницы во времени между тем, когда getUserMedia() обещание getUserMedia(), и когда оно отклонено или разрешено, например:

// In the Promise handlers, if Date.now() - now < 500 then we can assume this is a persisted user setting
var now = Date.now();
navigator.mediaDevices.getUserMedia({audio: true, video: false})
.then(function(stream) {
  console.log('Got stream, time diff :', Date.now() - now);
})
.catch(function(err) {
  console.log('GUM failed with error, time diff: ', Date.now() - now);
});

Эта средняя статья дает более подробную информацию.

Надеюсь это поможет!

Ответ 4

Обратите внимание на приведенные ниже пункты.

1. Localhost: In Localhost Chrome Browser asking permission only one time and Firefox every pageload.

2. HTTPS: Both Browsers Chrome and Firefox asking permission only one time.

Ответ 5

Похоже, что сегодня утром все оживилось. Chrome начиная с версии 46.0.2490.71 м больше не запрашивает у меня правдоподобные разрешения от localhost.

Ответ 6

Обновленный ответ на этот вопрос заключается в том, что Chrome (в настоящее время тестируется на 73) больше не непрерывно запрашивает доступ к камере, когда запрос выполняется по HTTP.

Firefox, однако, делает.