2014-04-13 12 views
10

tôi sẽ thích để phát hiện hay không cho phép micro đã được cấp trên trang web của tôi khi nó tải mà không thực sự chạy giống như sau:Làm thế nào để phát hiện nếu quyền microphone đã được cấp trong chrome

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

Có một API đơn giản để phát hiện liệu người dùng có cấp quyền truy cập micrô vĩnh viễn cho ứng dụng của tôi (chạy trên https) không?

Trả lời

0

bạn đã có phương pháp bỏ phiếu để kiểm tra quyền. đây là một số thông tin từ MDN: https://developer.mozilla.org/en-US/docs/Web/API/Navigator.getUserMedia

và một số chi tiết: https://developer.mozilla.org/en-US/docs/WebRTC

đây là một ví dụ:

navigator.getMedia (
// constraints 
    { 
     video: true, 
     audio: true 
    }, 

    // successCallback 
    function(localMediaStream) { 
     var video = document.querySelector('video'); 
     video.src = window.URL.createObjectURL(localMediaStream); 
     video.onloadedmetadata = function(e) { 
     // Do something with the video here. 
     }; 
    }, 

    // errorCallback 
    function(err) { 
    console.log("The following error occured: " + err); 
    } 

); 
+0

Anh ấy hỏi cách nhận trạng thái cho phép, điều này có nghĩa là không nhận được luồng phương tiện của người dùng – Endless

+0

Bạn có thể tạo luồng phương tiện bên ngoài vùng màn hình, sau đó bạn có kiểm tra của bạn và người dùng không biết/nhớ. Cũng giống như một khung đệm phía sau cho một trò chơi html5. – Zezura

5

Bạn có thể hy vọng rằng nó sẽ có thể truy cập từ các api phép, nhưng nó không phải là :(

Có lẽ trong tính năng này có thể hoạt động như phần còn lại của điều này:

navigator.permissions.query(
    // {name: 'video'} <-- doesn't work 
    // {name: 'audio'} <-- doesn't work 
    {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); 
    } 

}) 

Cách duy nhất tôi thấy có thể là nếu bạn tự theo dõi điều này bằng một mục khóa/giá trị trong localStorage khi bạn yêu cầu quyền.

Đáng tiếc là nó không thông báo cho bạn khi nó đã được thay đổi

// 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"); 
    } 
}); 

Bạn có thể đi những dặm thêm và xây dựng một chút wrapper tốt đẹp với mã này trên và mở rộng/thay thế các api phép xử lý nhiều tên enum hơn và tạo một api broadcast để báo cho các tab khác khi nó thay đổi. nhưng tại sao làm cho nó phức tạp ...? LocalStorage không thể tin cậy 100%. nó có thể được thay đổi bất cứ lúc nào cả khi có quyền và bộ nhớ đã xóa

+0

Snipet đầu tiên được đề cập ở trên không hoạt động đối với âm thanh như bạn đã chỉ ra. Nhưng có anyway chúng ta có thể tìm thấy tình trạng của nó như của tình trạng vị trí? –

Các vấn đề liên quan