在Javascript中检测Chrome媒体设置

时间:2013-07-12 21:30:37

标签: javascript google-chrome

Chrome最近发布了对其媒体设置的更新,该更新会提示用户授予允许访问其麦克风和相机的网站的权限。有没有办法在Javascript中检测这些设置?

我有一个带有麦克风功能的Flash播放器(最终将基于HTML5)。目前,播放器设置了一个友好的教程,介绍如何在开始会话之前授予权限。但是,由于Chrome发布了此更新,因此在用户允许/拒绝Chrome设置提示之前,Flash播放器和Chrome权限相互冲突会导致闪存错误。我想做的是,在播放器转移到HTML5之前,检测浏览器是否为Chrome(具有适当的版本),如果用户的设置未设置为显示其他教程屏幕。

2 个答案:

答案 0 :(得分:2)

夫妻俩:

  • 这是针对Chromes实施的,因此您无法分辨用户授予的权限,除非Chrome将该信息提供给您的应用。 I.E.没有API,您可以查询此信息。
  • 这甚至不是Chrome存储的东西。如果您在advanced settings tab on this page下查看,您会看到它基于每个应用程序而不是一次性的事情。只有当该应用要求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);

不完美(真的很奇怪和悲伤),但似乎适用于最常见的情况。