最初拒绝后,再次使用getUserMedia()提示权限


76

拒绝一次后,如何通过getUserMedia()请求摄像头/麦克风访问?

我正在与getUserMedia一起使用,以访问用户的相机并将数据通过管道传输到画布。那一点一切正常。

在测试中,我一次拒绝。此时,在Chrome和Firefox中,任何带有getUserMedia()的后续请求均默认为拒绝状态。

我们显然不希望在被拒绝后在每次加载页面时请求摄像头/麦克风的权限来惹恼我们的用户。地理位置api已经足够令人讨厌。

但是,必须有一种方法可以再次请求它。仅仅因为用户单击一次“拒绝”并不意味着他们要一直拒绝网络摄像头访问。

我一直在阅读有关规范的信息,并搜索了一段时间,但是我没有明确发现有关此问题的任何信息。

编辑:进一步研究,似乎在Chrome中点击“拒绝”会将当前站点添加到阻止列表。可以通过chrome:// settings / content手动访问。滚动到媒体。管理例外,删除被阻止的站点。

链接到chrome:// settings / content无效(在我们要添加有用的链接以使人们重新启用权限的情况下)。

用于处理围绕getUserMedia的权限的整个UX会发臭。=(


1
谢谢你 直接通过设置>显示高级设置,但通过chrome:// settings / content
Teknotica,2013年

点击行为一次拒绝后拒绝后续请求是Chrome的行为,而不是Firefox。只有在https站点的下拉列表中选择“始终拒绝”,该情况才会在Firefox中发生。
2015年

1
在Chrome浏览器中,用户可以单击网址栏中的相机图标撤消上一个阻止或管理阻止列表。无需搞砸chrome://链接
三角帆

Answers:


25

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
不,你不能,幸运的是!!!它将允许网站,应用程序和其他任何东西未经其同意而访问人们的媒体设备,这将构成隐私强奸……
Flo Schild

20

使用HTTPS。当用户一次授予权限时,它会被记住,Chrome不会再次请求该页面的权限,您可以立即访问媒体。这不会为您提供一种在用户上再次强制使用权限栏的方法,但是至少要确保一旦用户授予一次权限,您就不必继续要求它。

如果您的应用是从SSL(https://)运行的,则此权限将是持久的。也就是说,用户不必每次都授予/拒绝访问权限。

请参阅:http : //www.html5rocks.com/zh-CN/tutorials/getusermedia/intro/


2
Firefox上的HTTP不会保留此权限。
Rui Marques 2014年

1
现在,它可以在Firefox中使用,但是下拉菜单下的“始终共享”选项有点隐藏。
xdumaine 2015年

与“始终拒绝”相同,“始终共享”在Firefox中有点隐藏。OP的问题在Firefox中不会发生。
2015年

2
使它在firefox中工作:about:config->将media.navigator.permission.disabled标志设置为真实的原始答案
Mido 2016年

谢谢mido:真该死的烦人-现在可以使用(在最初拒绝该网络摄像头后,访问Firefox 50中提供的localhost file:///网页中的本地USB网络摄像头)。薄饼。:-/
Victoria Stuart

16

Chrome实施Permissions APIin navigator.permissions,这同样适用于cameramicrophone权限。

因此,到目前为止,在调用之前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将返回deniedgrantedprompt

有用的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/zh-CN/docs/Web/API/Navigator/permissions的 权限,Internet Explorer,Safari,Safari IOS和Android网络视图不支持此权限。你知道可以使用也这儿过得都问一个问题关于此的任何其他方法stackoverflow.com/questions/64679982/...
阿努普

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.


1

更新后的答案是,当通过HTTP请求时,Chrome(当前在73上进行测试)不再继续提示摄像机访问。

但是,Firefox确实如此。


我如何强迫它弹出?就像我对本地设备没有HTTP权限一样。
乔纳森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.