Chrome最近发布了对其媒体设置的更新,该更新会提示用户授予允许访问其麦克风和相机的网站的权限。有没有办法在Javascript中检测这些设置?
我有一个带有麦克风功能的Flash播放器(最终将基于HTML5)。目前,播放器设置了一个友好的教程,介绍如何在开始会话之前授予权限。但是,由于Chrome发布了此更新,因此在用户允许/拒绝Chrome设置提示之前,Flash播放器和Chrome权限相互冲突会导致闪存错误。我想做的是,在播放器转移到HTML5之前,检测浏览器是否为Chrome(具有适当的版本),如果用户的设置未设置为显示其他教程屏幕。
答案 0 :(得分:2)
夫妻俩:
https
以上的权限时,Chrome才会记住为特定应用授予的权限。如果它通过http
请求它,那么它将忘记授予了哪些权限。你最好的选择(虽然绝不是完全证明)是嗅出浏览器代理和版本。对于其中一个更好的实现,请参阅here。
您需要专门查找Chrome和任何版本> = 21.(21是引入getMediaApi
的版本)。然后这是一个简单的if
检查:
if (version >= 21){
//ask permission though the getMediaApi
} else{
//ask permission though flash
}
答案 1 :(得分:0)
我偶然发现这种方法运行得相当好,并且不需要cookie(人们可以在带外更改这些设置,因此cookie可能会变得不正确),或者Chrome会提供一些帮助(它没有)。
if (chrome) {
var madeMicDecision = false;
navigator.getUserMedia({whatever},
function(stream) {
madeMicDecision = true;
//close the stream, move to the next page
//they have either just granted permission, or have in the past and it's remembered
},
function(error) {
madeMicDecision = true;
//go to error handling page
//the error handling page should describe going to chrome://settings/contentExceptions#media-stream
//or how to allow the user media via clicking on the crossed out camera icon in the 'wonderbar'
}
}
但是我们也希望显示教程屏幕 - 如果不记住权限设置,上面的代码将弹出chrome信息框。但是,如果没有来自chrome的权限事件或用于查询权限的API,我们如何知道何时显示chrome + infobox教程内容?
我的诀窍是自动显示内容,但只是在延迟之后。之前已接受或拒绝权限的人永远不会看到此内容,因为我们的成功/错误处理程序会在延迟之前将其移动。所以,给getUserMedia调用一下时间来检测/反应 - 如果浏览器没有继续,则是时候显示帮助内容。
setTimeout(function() {
if (!madeMicDescision) {
//display chrome/infobox/getUserMedia permissions help content
}
}, 2000);
不完美(真的很奇怪和悲伤),但似乎适用于最常见的情况。