当用户在调用getUserMedia时拒绝使用麦克风时,Firefox是否会触发错误?此代码不会在Firefox中记录错误,但会在Chrome中记录错误。
这是我正在使用的代码:
navigator.mediaDevices.
getUserMedia(media).
then(function(stream) {
// doing some stuff here
}).
catch(function(error) {
// log errors
console.log(error);
});
我缺少什么?
编辑:我刚刚发现,如果我在权限对话框中点击“不是现在”,则不会触发任何错误。如果我点击“从不为这个网站”,则会触发错误,但是这种行为远非理想,因为我(如果有意)点击“不是现在”而不是授予权限,我没有机会通知用户。
答案 0 :(得分:1)
是的,它会在firefox上触发。
但是,当用户点击“不是现在”时,设计就是这样。请求仍然有效;用户仍然可以通过单击右侧的URL窗格图标来允许访问媒体设备。因此,您无法获得任何反馈。 是的,在chrome上你得到一个错误但不是在Firefox上。
您需要使用计时器来检测此类情况(hackish)。
有关详细信息,请参阅此主题:https://bugzilla.mozilla.org/show_bug.cgi?id=947266
如果用户提供权限,则使用生成的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);