3

Chrome 最近发布了对其媒体设置的更新,该更新提示用户向允许访问他/她的麦克风和摄像头的站点授予权限。有没有办法在 Javascript 中检测这些设置?

我有一个带有麦克风功能的 Flash 播放器(最终将基于 HTML5)。播放器当前设置了关于如何在开始会话之前授予权限的友好教程。但是,自从 Chrome 发布更新后,Flash 播放器和 Chrome 权限发生冲突,导致 Flash 出现错误,直到用户允许/拒绝 Chrome 设置提示。在将播放器移至 HTML5 之前,我想要做的是检测浏览器是否为 Chrome(具有适当的版本)以及用户的设置是否未设置为然后显示附加教程屏幕。

4

2 回答 2

2

几件事:

  • 这是特定于 Chrome 实现的,因此除非 Chrome 向您的应用程序提供该信息,否则您无法判断用户授予了哪些权限。IE 没有您可以查询此信息的 API。
  • 它甚至不是 Chrome 存储的东西。如果您查看此页面上的高级设置选项卡,您会发现它基于每个应用程序,而不是一次性的。只有在特定应用程序请求权限时,Chrome 才会记住授予了该应用程序的权限https。如果它要求它,http那么它将忘记授予了哪些权限。

您最好的选择(尽管绝不是完全证明)是嗅出浏览器代理和版本。有关此的更好实现之一,请参见此处

您将需要专门寻找 Chrome 和任何 >= 21 的版本。(21 是引入 的版本getMediaApi)。然后是一个简单的if检查:

if (version >= 21){
    //ask permission though the getMediaApi 
} else{
    //ask permission though flash
}
于 2013-07-12T22:01:23.627 回答
0

我偶然发现了一种效果很好的方法,并且不需要 cookie(人们可以带外更改这些设置,因此 cookie 可能会变得不正确),或者 Chrome 提供一点帮助(它不需要't)。

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);

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

于 2014-08-12T11:32:26.100 回答