我有一个Web应用程序,它通过getUserMedia
将麦克风用于WebRTC。我目前有这个应用程序在多个子域上运行,例如test.example.com
,staging.example.com
,production.example.com
等。在大多数情况下,它都能正常工作。
在其中一个域(test
)上,我无法使用麦克风。我的代码使用回调函数调用getUserMedia
,但从未执行该回调函数,也从未显示浏览器的权限提示。
我还使用开发人员工具控制台使用新的基于Promise的API复制了此行为:
navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(console.log).catch(console.log)
(是的,我知道它对then
和catch
做相同的事情,但是在这种情况下无关紧要。)
在工作站点(例如,stage
)上,这是控制台中的结果:
Promise {<pending>}
MediaStream {id: "RANDOM_CHARS", active: true, onaddtrack: null, onremovetrack: null, onactive: null, …}
在非工作站点上,它仅显示Promise {<pending>}
,但then
或catch
都不记录任何内容,因为它从不解决任何问题。
我发现如果进入站点设置(chrome://settings/content/siteDetails?site=https%3A%2F%2Ftest.example.com
)并将Microphone
更改为Allow
,那么我可以刷新页面,并且该页面可以正常工作。如果我将其更改回Ask
,则会再次得到相同的行为-它不会询问。
关于我测试过的any网站和any权限,这种行为是正确的-不需要Allow
ed权限改回Ask
。但是,在这个特定的test
网站上,我从未尝试过使用它,因此没有理由将其设置为Allow
然后又返回Ask
以触发该行为。
在所有这些情况下,navigator.permissions.query({name: "microphone"}).then(console.log)
均按预期返回PermissionStatus {state: "prompt", onchange: null}
。
如何让Chrome重新提示输入麦克风权限?
如果Chrome在系统设置中根本没有麦克风权限,就会发生此问题。给它授予麦克风权限,然后它将开始询问是否授予网站麦克风权限。