我有一个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
,我会再次获得相同的行为 - 它不会问。
对于任何网站以及我测试过的任何权限,这种行为都是如此 - 将Allow
ed权限更改回Ask
并不# 39;不要问。但是,在这个特定的test
网站上,我从未尝试过使用它,因此没有理由将它设置为Allow
然后再回到Ask
触发这种行为。
在所有这些情况下,navigator.permissions.query({name: "microphone"}).then(console.log)
按预期返回PermissionStatus {state: "prompt", onchange: null}
。
如何让Chrome再次提示获得麦克风权限?
答案 0 :(得分:-1)
您需要一个使用 https 协议的有效域,才能让 Chrome 提示授予权限。