3

使用getUserMedia让用户选择麦克风。此外,我使用enumerateDevices创建一个带有设备的选择,以便用户可以从 UI 更改设备。

我在 Firefox 上,还没有检查其他浏览器的表现,但至少对于 FF,我还没有找到解决方案。

如果用户在被询问时选择不允许访问,则在用户删除限制之前不要再次询问[1] :

在此处输入图像描述

问题是是否有办法检测用户何时取消限制?

场景通常是:

  1. 用户加载页面并被要求选择输入设备
  2. 用户拒绝

    UI disables device selector + hide various stuff
    
  3. 用户取消限制(如上图)

    UI enables device selector + unhide various stuff
    

(显然)没有办法通过 Java 脚本从客户端重置块,但是有没有办法检测到用户撤销了块?(或者有吗?听起来像是可以被利用来保持循环访问请求的东西。)

可以做一个循环,在页面的整个生命周期内不断尝试,但希望避免这种情况。正在为此寻找活动。

在这方面,ondevicechange不会在删除块时触发事件 - 这在某种程度上是合乎逻辑的,因为可用设备没有变化,以某种方式:P。


[ 1 ]那就是:一个人可以问,但结果是:

MediaStreamError
消息:在当前上下文中,用户代理或平台不允许该请求。
名称: NotAllowedError ​</p>

4

1 回答 1

4

您应该能够从Permissions API检测到此更改。

由返回的PermissionStatus对象Permissions.prototype.query()有一个onchange事件处理程序。因此,当用户更改其设置时,对"camera"or的查询"microphone"将触发其更改事件。

const camera_perm = await navigator.permissions.query( { name: 'camera' } );
camera_perm.onchange = (evt) => {
  const allowed = camera_perm.state === "granted";
  if( allowed ) {
    // ...
  }
  else {

  }
};

这目前在 Chrome中有效,但 Firefox 仍然不支持PermissionDescriptor"camera""microphone"成员。因此,对于该浏览器,我们最接近的方法是通过轮询,如本 Q/A 中所述:允许“相机和麦克风被阻止”的事件侦听器

于 2020-04-06T01:33:05.910 回答