Javascript 检测设备限制的解除

Javascript 检测设备限制的解除,javascript,media,mediadevices,Javascript,Media,Mediadevices,用于让用户选择麦克风。此外,我使用创建一个选择设备,以便用户可以从UI更改设备 我在Firefox上,并没有检查其他浏览器的运行情况,但至少对于FF,我还没有找到解决方案 如果用户在被询问时选择不允许访问,则在用户取消限制之前,不得再次询问[1]: 问题是,是否有一种方法可以检测用户何时删除限制 场景通常是: 用户加载页面并被要求选择输入设备 用户拒绝 UI disables device selector + hide various stuff 用户解除限制(如上图所示) 显然,没有

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

我在Firefox上,并没有检查其他浏览器的运行情况,但至少对于FF,我还没有找到解决方案

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

问题是,是否有一种方法可以检测用户何时删除限制

场景通常是:

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

    UI disables device selector + hide various stuff
    
  • 用户解除限制(如上图所示)

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

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

    在这方面,当块被移除时不会触发事件-这在某种程度上是合乎逻辑的,因为可用设备没有变化,在某种程度上:p


    [1]也就是说:可以问,但结果是:

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


    您应该能够从中检测到此更改

    返回的对象具有
    onchange
    事件处理程序。因此,当用户更改其设置时,对
    “摄像头”
    “麦克风”
    的查询将触发其更改事件

    const camera_perm = await navigator.permissions.query( { name: 'camera' } );
    camera_perm.onchange = (evt) => {
      const allowed = camera_perm.state === "granted";
      if( allowed ) {
        // ...
      }
      else {
    
      }
    };
    
    目前,Firefox仍然不支持PermissionDescriptor的
    “摄像头”
    “麦克风”
    成员。
    因此,对于该浏览器,我们可以使用的最接近的方法是通过轮询,如本问答中所述。

    Nice。这就是我要找的。太糟糕了,FF落后了,但至少知道一个地方可以关注进度。与此同时,您可能已经使用了
    navigator.permissions.revoke
    作为可选的回退,但这需要用户启用,因此很可能不处于活动状态。
    const camera_perm = await navigator.permissions.query( { name: 'camera' } );
    camera_perm.onchange = (evt) => {
      const allowed = camera_perm.state === "granted";
      if( allowed ) {
        // ...
      }
      else {
    
      }
    };