2017-02-11 40 views
1

我调整了一个库,通过用户的麦克风录制MP3音频。如果用户允许或拒绝对麦克风的访问请求,我很好,但我注意到,这MDN saysgetUserMedia - 如果用户别无选择,该怎么办?

注意,有可能返回的承诺没有解决 也没有拒绝,因为用户不需要做出选择。

但似乎没有说什么,如果有的话,我可以做到“无选择”行动。如果用户只是退出对话框,或者在没有做出选择的情况下模糊了对话框,我可以捕捉并调整我的UI吗?

这里是我当前的代码:

navigator.mediaDevices.getUserMedia({audio: true}).then(function(stream) { 
    build_ui(); 
    startUserMedia(stream); 
}).catch(function(e) { //<-- doesn't fire if no choice made 
    cfg.no_device_callback && cfg.no_device_callback(e); 
}); 
+0

我想你可以使用承诺的“拒绝”方法来捕捉,如果错误不被抛出。 –

+0

但是,这只是它 - 如果用户别无选择,承诺是*不*被拒绝。 – Utkanos

+0

我无法想象用户的情况在5分钟内没有选择,所以如果用户在X分钟内没有选择,您可以开始超时手动拒绝。 –

回答

1

您可以实现您所拥有的承诺超时。

例如,您可以如下延长无极对象和原型:

Promise.wait = function (ms) { 
    return new Promise(function (resolve) { 
     setTimeout(resolve, ms); 
    }); 
}; 

Promise.prototype.timeout = function(ms) { 
    return Promise.race([ 
     this, 
     Promise.wait(ms).then(function() { 
      throw new Error("time out"); 
     }) 
    ]) 
}; 

一旦你的,你可以在一个.timeout(10000)链:

navigator.mediaDevices.getUserMedia({audio: true}) 
     .timeout(10000).then(function(stream) { 
//  ^^^^^^^^^^^^^^^ 
    build_ui(); 
    startUserMedia(stream); 
}).catch(function(e) { //<-- now also fires if no choice made within 10 secs 
    cfg.no_device_callback && cfg.no_device_callback(e); 
}); 
0

火狐(57)不允许用户关闭权限对话框。直到你做出选择此对话框将无限期地保持可见:

enter image description here

Safari浏览器(11)不允许用户关闭该对话框。更重要的是它也锁定了整个浏览器(包括其他标签),因此顶部强制用户的手做出一个选择:

enter image description here

铬(62)允许用户驳回通过对话右上方[x]按钮:

enter image description here

在这种情况下选择和actionis明显因此Chrome抛出命名PermissionDismissedError非规范误差,但可能会在Chrome 64试图朝着SP移动被去除该错误符合EC标准的错误(请参阅this Chromium bug)。

我写的更多的是getUserMedia错误this article

相关问题