reprompt for permissions with getUserMedia() after initial denial reprompt for permissions with getUserMedia() after initial denial javascript javascript

reprompt for permissions with getUserMedia() after initial denial


jeffreyveon's answer will help reduce the chance that your user will choose deny, since she will only have to choose once.

In case she does click deny, you can provide a message that explains why you need the permission and how to update her choice. For example:

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


Chrome implements the Permissions API in navigator.permissions, and that applies to both camera and microphone permissions too.

So as of now, before calling getUserMedia(), you could use this API to query the permission state for your camera and microphone :

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

On success, permissionObj.state would return denied, granted or prompt.

Useful SF question/answer here

For a cross browser solution, one simple approach can be to monitor the time difference between when the getUserMedia() Promise is called, and when it is rejected or resolved, like so :

// In the Promise handlers, if Date.now() - now < 500 then we can assume this is a persisted user settingvar 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);});

This Medium article gives more details.

Hope this helps!


Use HTTPS. When the user gives permission once, it's remembered and Chrome does not ask for permission for that page again and you get access to the media immediately. This does not provide you a way to force the permission bar on the user again, but atleast makes sure you don't have to keep asking for it once the user grants the permission once.

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.

See: http://www.html5rocks.com/en/tutorials/getusermedia/intro/