JavaScript调用getUserMedia必须在HTTPS或localhost安全上下文中,需用户显式授权且不可绕过;权限状态须主动检查,流使用后须及时停止以保障隐私。
JavaScript 通过 navigator.mediaDevices.getUserMedia() 获取摄像头权限时,必须严格遵守浏览器的隐私机制和用户授权原则。它不是“直接调用硬件”,而是触发用户主动授予权限的流程,任何绕过用户确认的操作都会被现代浏览器阻止。
getUserMedia 只能在 HTTPS 协议(或 localhost)下运行。HTTP 页面会直接抛出 NotAllowedError 或拒绝 Promise。这是硬性限制,没有例
外。
确保你的页面地址以 https:// 开头,开发阶段可用 http://localhost 测试,但部署到真实域名时务必配置有效 SSL 证书。
浏览器不会记住“永久允许摄像头”,每次调用 getUserMedia(除非复用已有活跃流)都可能再次弹出权限提示——尤其是当用户之前点了“拒绝”或“仅一次”后。
常见误区:
{ video: true, audio: false } 隐蔽开启摄像头(不行,用户仍看到明确请求)用户可在系统设置或浏览器地址栏随时撤销权限。应使用 navigator.permissions.query({ name: 'camera' }) 检查当前状态:
注意:该 API 本身也受安全上下文限制,且部分旧版浏览器不支持。
获得 MediaStream 后,若不再需要视频,应显式调用 stream.getTracks().forEach(track => track.stop())。否则摄像头指示灯可能持续亮起,引发用户隐私疑虑。
尤其注意以下场景:
useEffect cleanup 或 beforeUnmount 中停止)不复杂但容易忽略:隐私不是功能附加项,而是 getUserMedia 的前提条件。每一次调用,都是对用户信任的一次索取——清晰告知用途、尊重拒绝、及时释放资源,才是合规使用的本质。