安卓webview调用mediaDevices.getUserMedia权限被拒问题求助
Android WebView调用getUserMedia权限被拒遗漏配置项汇总
WebView层的权限控制和系统应用权限是独立的,哪怕应用已经拿到系统相机权限,也需要完成以下WebView专属配置:
- 首先开启WebView基础媒体相关配置,在WebSettings中添加以下设置:
WebSettings webSettings = webView.getSettings(); // 开启JS支持,getUserMedia依赖JS调用 webSettings.setJavaScriptEnabled(true); // 关闭媒体播放需要用户手势的限制,避免自动播放失败 webSettings.setMediaPlaybackRequiresUserGesture(false); // 允许访问本地文件,如果你加载的是本地网页资源需要开启 webSettings.setAllowFileAccess(true); // 允许混合内容,如果你加载的是HTTP页面需要开启(仅测试用,生产环境建议使用HTTPS) webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); - 重写WebChromeClient的
onPermissionRequest方法,放行网页发起的媒体权限申请
这是最容易被忽略的核心配置点,安卓原生WebView默认会拒绝所有网页发起的权限请求,和应用是否有系统权限无关webView.setWebChromeClient(new WebChromeClient() { @Override public void onPermissionRequest(final PermissionRequest request) { // 直接放行申请的所有权限,也可以根据request.getResources()过滤只放行媒体相关权限 request.grant(request.getResources()); } }); - 检查AndroidManifest.xml配置,确保添加了所有必要权限
同时给WebView所在的Activity开启硬件加速,避免视频渲染异常:<!-- 基础网络权限,加载网页必须 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 如果你后续需要开启音频采集需要添加 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><activity android:name=".YourWebViewActivity" android:hardwareAccelerated="true" /> - 如果你使用的是Ionic/Cordova/Capacitor等跨端框架的WebView,还需要额外在框架配置文件中开启媒体访问权限,比如Cordova需要在config.xml中添加:
<preference name="AndroidInsecureFileModeEnabled" value="true" /> <preference name="MediaCapture" value="true" />
内容的提问来源于stack exchange,提问作者Nelah
相关产品推荐
相关产品推荐

