повторне запрошення дозволів із getUserMedia () після початкової відмови


76

Як нам запитати доступ до камери / мікрофона за допомогою getUserMedia () після відмови одного разу?

Я працюю з getUserMedia, щоб отримати доступ до камери користувача та перенести дані на полотно. Це трохи працює добре.

Під час тестування я один раз вдарив заперечити. На даний момент у Chrome та Firefox будь-які наступні запити з getUserMedia () за замовчуванням станом на відхилений.

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

Однак, повинен бути спосіб, щоб подати запит ще раз. Просто тому, що користувач один раз вдарив заборони, це не означає, що він хоче заперечувати доступ до веб-камери на всі часи.

Я вже деякий час читаю про специфікацію і гуглюю, але я не знаходжу нічого явного щодо цієї проблеми.

Редагувати: Подальші дослідження виявляють, що натискання кнопки Заборонити в Chrome додає поточний сайт до списку блоків. До цього можна отримати доступ вручну через chrome: // settings / content. Перейдіть до Медіа. Керуйте винятками, видаліть заблоковані сайти.

Посилання на chrome: // settings / content не працює (у випадку, коли ми хочемо додати корисне посилання, щоб дозволити людям знову ввімкнути дозволи).

Весь UX для роботи з дозволами навколо getUserMedia смердить. = (


1
Дякую за це. Я не міг побачити розділ ЗМІ, переходячи безпосередньо через Налаштування> Показати розширені налаштування, але через chrome: // settings / content
Teknotica

Відмова в наступних запитах після натискання кнопки заборони один раз - це поведінка Chrome, а не Firefox. Лише якщо ви вибрали "Завжди відмовляти" у спадному меню на https-сайті, це відбувається у Firefox.
стріла

1
У Chrome користувачі можуть натиснути на піктограму камери на панелі url, щоб скасувати попередній блок або керувати списком блоків. Не потрібно возитися з chrome: // links
jib

Відповіді:


26

Відповідь jeffreyveon допоможе зменшити ймовірність того, що ваш користувач обере відмову, оскільки їй доведеться вибрати лише один раз.

У випадку, якщо вона натискає кнопку "Відмовити", ви можете надати повідомлення, яке пояснює, навіщо вам потрібен дозвіл і як оновити її вибір. Наприклад:

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

Чи можу я уникнути клацання дозволити доступ до камери при завантаженні сторінки. Чи можна цим керувати за допомогою JavaScript
Vivek Ranjan

5
Ні, ви не можете, і на щастя !!! Це дозволило б веб-сайтам, програмам та будь-чому іншому отримувати доступ до медіа-пристроїв людей без їхньої згоди, що було б зґвалтуванням конфіденційності ...
Фло Шильд,

20

Використовуйте HTTPS. Коли користувач дає дозвіл один раз, це запам’ятовується, і Chrome більше не просить дозволу на цю сторінку, і ви одразу отримуєте доступ до носія. Це не дає вам можливості змусити користувача знову накласти рядок дозволів, але принаймні гарантує, що вам не доведеться продовжувати просити про це, як тільки користувач надасть дозвіл один раз.

Якщо ваш додаток працює із SSL (https: //), цей дозвіл буде постійним. Тобто користувачам не доведеться надавати / забороняти доступ кожного разу.

Див .: http://www.html5rocks.com/en/tutorials/getusermedia/intro/


2
HTTP у Firefox не зберігатиме цей дозвіл.
Rui Marques

1
Зараз це працює у firefox, але опція "Завжди ділитися" трохи прихована під стрілкою спадного меню.
xdumaine

"Завжди ділитися" трохи сховано у Firefox так само, як "Завжди заперечувати". Проблема OP не трапляється у Firefox.
стріла

2
щоб це працювало у firefox: about:config-> встановити media.navigator.permission.disabledпрапорець як істинний, оригінальна відповідь
mido

Дякую mido: це було проклято надокучливо - працює зараз (доступ до локальної веб-камери USB у файлі localhost: /// веб-сторінки, що обслуговується у Firefox 50 після того, як спочатку заперечив цю веб-камеру). Кріпс. : - /
Вікторія Стюарт

19

Chrome реалізує Permissions APIin 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()викликається Promise, і коли його відхиляють або вирішують, наприклад:

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

Ця середня стаття містить більше деталей.

Сподіваюся, це допомагає!


згідно з developer.mozilla.org/en-US/docs/Web/API/Navigator/permissions дозволи не підтримуються в Internet Explorer, Safari, Safari IOS та веб-перегляді Android. Ви знаєте , будь-який інший метод , який може бути використаний here.I також поставив запитання щодо цього stackoverflow.com/questions/64679982 / ...
Anup

5

Зверніть увагу на наведені нижче пункти.

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.


1

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

Однак Firefox це робить.


Як змусити його спливати? Це поводиться так, ніби я не маю дозволів через HTTP на свій локальний пристрій.
Джонатан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.