如何检测是否已在 chrome 中授予麦克风权限

新手上路,请多包涵

我想在加载时检测是否已在我的网站上授予麦克风权限,而无需实际运行以下内容:

 navigator.webkitGetUserMedia({audio: active},
    function(){alert('worked')},
    function(){alert('failed')});

是否有一个简单的 API 来检测用户是否已永久授予麦克风访问我的应用程序(通过 https 运行)?

原文由 E T 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

更新

microphone 已添加到 权限 API ,即使它在 Safari 或 Internet Explorer 上尚不可用。

你可能希望它可以从权限 api 访问,但它不是:(

也许在功能中这可以像其余部分一样工作:

 navigator.permissions.query(
    // { name: 'camera' }
    { name: 'microphone' }
    // { name: 'geolocation' }
    // { name: 'notifications' }
    // { name: 'midi', sysex: false }
    // { name: 'midi', sysex: true }
    // { name: 'push', userVisibleOnly: true }
    // { name: 'push' } // without userVisibleOnly isn't supported in chrome M45, yet
).then(function(permissionStatus){

    console.log(permissionStatus.state); // granted, denied, prompt

    permissionStatus.onchange = function(){
        console.log("Permission changed to " + this.state);
    }

})

旧答案

我认为可能的唯一方法是,如果您在请求许可时使用 localStorage 中的键/值项自己跟踪这个。

不幸的是,它在更改时不会通知您

// initialization
if( localStorage.getItem('voice_access') === null ){
    // just assume it is prompt
    localStorage.setItem('voice_access', 'prompt');
}

// Then somewhere
navigator.getUserMedia({ audio: true }, function (e) {
    // http://stackoverflow.com/q/15993581/1008999
    //
    // In chrome, If your app is running from SSL (https://),
    // this permission will be persistent.
    // That is, users won't have to grant/deny access every time.
    localStorage.setItem("voice_access", "granted");

}, function (err) {
    if (err.name === 'PermissionDismissedError') {
        localStorage.setItem('voice_access', 'prompt')
    }
    if (err.name === 'PermissionDeniedError') {
        localStorage.setItem('voice_access', 'denied')
    }
})


您可以加倍努力,使用上面的代码构建一个漂亮的小包装器,并扩展/替换权限 api 以处理更多枚举名称,并创建 广播 api 以在更改时通知其他选项卡。但为什么要让它变得如此复杂……? localStorage 不能 100% 可信。在获得许可和清除存储的情况下,可以随时随地更改它

原文由 Endless 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题