2017-02-11 51 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

相關問題