Flutter web通过IP访问时相机与麦克风权限被拦截,localhost正常如何解决?
问题根因
这是浏览器的默认安全策略限制:只有*安全上下文(Secure Context)*才允许调用相机、麦克风、定位等敏感系统权限。localhost被浏览器默认归类为安全上下文,所以可以正常调用权限;而普通HTTP协议的IP地址不属于安全上下文范畴,因此权限请求会被直接拦截。
解决方案
根据你的使用场景可以选择对应方案:
- 本地局域网测试场景:启动Flutter Web调试服务时添加SSL参数,用HTTPS协议启动服务。执行命令:
同局域网设备通过flutter run -d chrome --web-ssl --web-hostname 0.0.0.0https://IP:端口访问时,手动信任浏览器弹出的自签名证书风险警告后,即可正常申请相机、麦克风权限。 - 临时快速测试场景:可以修改浏览器安全规则,将你的测试IP加入安全上下文白名单。以Chrome为例:
- 地址栏输入
chrome://flags/#unsafely-treat-insecure-origin-as-secure打开配置页 - 下拉选项选择
Enabled,输入框填入你的服务地址,例:http://192.168.1.2:8080 - 重启浏览器后即可生效,该方案仅适合开发测试使用,不要推广给普通用户。
- 地址栏输入
- 生产环境部署场景:给你的线上域名申请可信CA机构颁发的SSL证书,全链路使用HTTPS协议对外提供服务,即可自动满足安全上下文要求,权限可正常调用。
注意:如果使用了反向代理、CDN等中间服务,需要确保从用户终端到服务端的整个访问链路都是HTTPS协议,否则依然会被浏览器判定为非安全上下文拦截权限。
内容的提问来源于stack exchange,提问作者SuperDog
相关产品推荐
相关产品推荐

