【问题标题】:getUserMedia silently fails on user declining permission to use microphone in Firefox用户拒绝在 Firefox 中使用麦克风的权限时,getUserMedia 静默失败
【发布时间】:2017-04-10 06:43:23
【问题描述】:

当调用 getUserMedia 时用户拒绝使用麦克风时,Firefox 不会触发错误吗?此代码不会在 Firefox 中记录错误,但在 Chrome 中会。

这是我正在使用的代码:

navigator.mediaDevices.
    getUserMedia(media).
    then(function(stream) {
        // doing some stuff here
    }).
    catch(function(error) {
        // log errors
        console.log(error);
    });

我缺少什么吗?

编辑:我刚刚发现,如果我在权限对话框中单击“现在不”,则不会触发任何错误。如果我单击“从不用于此网站”,则会触发错误,但这种行为远非理想,因为我没有机会通知用户,以防他(不小心)单击“不是现在”而不是授予权限。

【问题讨论】:

标签: javascript firefox webrtc getusermedia


【解决方案1】:

是的,它会在 firefox 上触发。

但这是设计使然,当用户单击“Not Now”时,请求仍处于活动状态;用户仍然可以通过单击右侧的 URL 窗格图标来允许访问媒体设备。因此,您不会得到任何反馈。 是的,在 chrome 上会出现错误,但在 firefox 上不会。

您需要使用计时器来检测这种情况(hackish)。

欲了解更多信息,请参阅此主题:https://bugzilla.mozilla.org/show_bug.cgi?id=947266

如果用户提供了权限,则返回的 Promise 将使用生成的 MediaStream 对象进行解析。如果用户拒绝许可,或者媒体不可用,则分别以 PermissionDeniedErrorNotFoundError 拒绝该承诺。

navigator.mediaDevices.getUserMedia({audio: true, video: true }).then(function(stream) {
  /* use the stream */
}).catch(function(err) {
  alert(err)
});

【讨论】:

  • 好吧,我能说什么。它不适用于我所有其他浏览器的位置。
  • 当我点击“不是现在”时,不会显示任何错误。我是否单击“从不”然后显示错误。但这种行为并不理想。
  • @ArminHierstetter 是的,你是对的。我已经解释了这个案例。您也可以参考提供的链接以获取有关此案例的更多信息
  • 谢谢。仍然认为 Firefox 应该改变它处理这个问题的方式。我觉得目前的行为没有意义。
【解决方案2】:

一种解决方法是使用focus 事件到throwError,或者将Error 传递给Promise.reject(),如果@987654328 时未定义stream,则.catch() 链接到相同的错误处理函数@ 重新获得焦点

   let stream;
   let handleError = error => {
     // log errors
     alert(error);
   }
   let getMediaPermission = new Promise(resolve => {          
      if ("MozAnimation" in document.body.style) {
        this.onfocus = () => {
          this.onfocus = null;
          if (!stream) Promise.reject(new Error("stream not defined"))
                       .catch(handleError)
        }
      }
      resolve(navigator.mediaDevices.getUserMedia({video:true}));
    });
    getMediaPermission
    .then(stream => {
      stream = stream;
      console.log(stream)
     // doing some stuff here
    })
    .catch(handleError);

【讨论】:

  • 太棒了!感谢那。仍然认为 Firefox 应该改变它处理这个问题的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 2014-06-18
相关资源
最近更新 更多