getUserMedia在用户拒绝在Firefox中使用麦克风的权限时无声地失败

时间:2017-04-10 06:43:23

标签: javascript firefox webrtc getusermedia

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

这是我正在使用的代码:

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

我缺少什么?

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

2 个答案:

答案 0 :(得分:1)

是的,它会在firefox上触发。

但是,当用户点击“不是现在”时,设计就是这样。请求仍然有效;用户仍然可以通过单击右侧的URL窗格图标来允许访问媒体设备。因此,您无法获得任何反馈。 是的,在chrome上你得到一个错误但不是在Firefox上。

  

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

有关详细信息,请参阅此主题:https://bugzilla.mozilla.org/show_bug.cgi?id=947266

enter image description here

  

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



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




答案 1 :(得分:1)

一种解决方法是将focus事件用于throw Error,或将Error传递给Promise.reject().catch()链接到同一错误stream重新获得焦点时未定义window的处理函数

   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);