初始拒绝后使用 getUserMedia() 重新提示权限

IT技术 javascript webrtc getusermedia
2021-02-28 14:10:02

在被拒绝一次后,我们如何使用 getUserMedia() 请求访问相机/麦克风?

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

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

我们显然不想在被拒绝后在每个页面加载时请求摄像头/麦克风的权限来惹恼我们的用户。地理定位 api 已经够烦人了。

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

我一直在阅读规范并在谷歌上搜索了一段时间,但我没有找到任何关于这个问题的明确信息。

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

链接到 chrome://settings/content 不起作用(在我们想要添加有用的链接以让人们重新启用权限的情况下)。

处理 getUserMedia 周围权限的整个 UX 很糟糕。=(

6个回答

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
    }
   }
);
不,你不能,幸运的是!!!它将允许网站、应用程序和任何未经他们同意的人访问媒体设备,这将是隐私强奸......
2021-04-30 14:10:02
我可以避免在页面加载时点击允许访问相机吗?可以用JavaScript控制吗
2021-05-12 14:10:02

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将返回denied,grantedprompt

有用的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);
});

这篇Medium 文章提供了更多细节。

希望这可以帮助!

根据developer.mozilla.org/en-US/docs/Web/API/Navigator/permissions 权限在 Internet Explorer、Safari、Safari IOS 和 Android 网页视图上不受支持。你知道这里可以使用的任何其他方法吗?我也问过一个关于这个问题的问题stackoverflow.com/questions/64679982/...
2021-05-14 14:10:02
2021-05-18 14:10:02

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

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

请参阅:http : //www.html5rocks.com/en/tutorials/getusermedia/intro/

谢谢 mido:这太烦人了 - 现在可以使用了(在最初拒绝该网络摄像头后,在 Firefox 50 中提供的 localhost file:/// 网页中访问本地 USB 网络摄像头)。绉纱。:-/
2021-04-25 14:10:02
Firefox 上的 HTTP 不会保留此权限。
2021-04-27 14:10:02
这现在在 Firefox 中有效,但“始终共享”选项在下拉箭头下有点隐藏。
2021-05-01 14:10:02
使其在 Firefox 中工作:about:config-> 将media.navigator.permission.disabled标志设置为 true,原始答案
2021-05-04 14:10:02
“始终共享”在 Firefox 中有点隐藏,就像“始终拒绝”一样。OP 的问题在 Firefox 中不会发生。
2021-05-05 14:10:02

请注意以下几点。

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.

对此的更新答案是,当请求通过 HTTP 时,Chrome(目前在 73 上测试)不再持续提示相机访问。

然而,Firefox 确实如此。

我如何强制它弹出?这就像我没有通过 HTTP 访问本地设备的权限一样。
2021-05-09 14:10:02