如何解决Android WebView无法访问摄像头与麦克风的问题
问题根因
你已经正确配置了App层面的系统权限申请逻辑,但WebView默认不会自动处理网页发起的媒体设备权限请求,需要你主动重写WebChromeClient的onPermissionRequest方法,将网页的权限申请和系统已授予的权限做关联处理。
修复步骤
1. 重写WebChromeClient的权限请求处理逻辑
把你原来的webview.webChromeClient = WebChromeClient()替换为自定义实现,代码如下:
webview.webChromeClient = object : WebChromeClient() { override fun onPermissionRequest(request: PermissionRequest?) { request ?: return // 匹配网页申请的相机/录音权限,和你已经申请的系统权限做映射 val allowedPermissions = request.resources.filter { it == PermissionRequest.RESOURCE_VIDEO_CAPTURE || it == PermissionRequest.RESOURCE_AUDIO_CAPTURE }.toTypedArray() if (allowedPermissions.isNotEmpty()) { // 授予网页对应权限 request.grant(allowedPermissions) } else { super.onPermissionRequest(request) } } }
2. 补充WebView配置
在WebView的settings配置中确认保留以下配置,缺失则补充:
settings.allowFileAccess = true // 你已经配置过mediaPlaybackRequiresUserGesture,确认保留即可 settings.mediaPlaybackRequiresUserGesture = false settings.domStorageEnabled = true
3. 调整执行顺序
建议把权限申请逻辑放在WebView加载网页之前执行,避免权限未授权完成就加载网页导致首次访问失败,修改onCreate的执行顺序:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_web_view) // 先检查权限 if (!isPermissionGranted()) { askPermissions() } // 再初始化WebView加载网页 WebViewSetup() }
4. 可选:添加权限申请结果回调
重写onRequestPermissionsResult,确保用户授予权限后自动重新加载网页:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == this.requestCode) { if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { // 权限全部授予,重新加载网页 webview.reload() } else { Toast.makeText(this, "需要相机和录音权限才能正常使用相关功能", Toast.LENGTH_SHORT).show() } } }
额外提示:你Manifest里声明的
<uses-permission android:name="android.webkit.PermissionRequest" />是无效配置,PermissionRequest是WebKit提供的处理权限请求的类,不是Android系统权限,可直接删除这行。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

