You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:27:05