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

Android WebView无法调用相机问题排查求助

Android WebView调用相机失败的问题修复

你的代码存在几个关键遗漏和错误,以下是具体问题和修复方案:

1. AndroidManifest.xml权限标签错误

你在声明MODIFY_AUDIO_SETTINGS权限时使用了错误的标签<user-permission>,正确的标签应该是<uses-permission>,这会导致该权限无法被系统识别。

修正后的权限声明:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-feature android:name="android.hardware.camera" android:required="true" />

2. 缺少动态权限申请

你的Target SDK版本为31,CAMERA、READ_EXTERNAL_STORAGE属于危险权限,仅在Manifest中声明是不够的,必须在运行时向用户申请权限。

在你的Fragment中添加动态权限申请逻辑:

private val REQUIRED_PERMISSIONS = arrayOf(
    Manifest.permission.CAMERA,
    Manifest.permission.READ_EXTERNAL_STORAGE
)
private val REQUEST_CODE_PERMISSIONS = 1001

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    if (allPermissionsGranted()) {
        setUpWebView()
    } else {
        ActivityCompat.requestPermissions(
            requireActivity(),
            REQUIRED_PERMISSIONS,
            REQUEST_CODE_PERMISSIONS
        )
    }
}

private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
    ContextCompat.checkSelfPermission(requireContext(), it) == PackageManager.PERMISSION_GRANTED
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_CODE_PERMISSIONS) {
        if (allPermissionsGranted()) {
            setUpWebView()
        } else {
            // 处理用户拒绝权限的情况,比如提示无法使用相机功能
        }
    }
}

3. WebChromeClient权限请求未正确处理

你的customWebChromeClient中,onPermissionRequest方法仅调用了super,没有实际批准网页的权限请求,导致网页无法获取相机访问权限。同时onPermissionRequestCanceled中的request?.deny()是多余的,会干扰系统默认处理逻辑。

修正后的customWebChromeClient:

private val customWebChromeClient = object : WebChromeClient() {
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onPermissionRequest(request: PermissionRequest?) {
        request?.grant(request.resources) // 批准网页的权限请求
    }

    override fun onPermissionRequestCanceled(request: PermissionRequest?) {
        super.onPermissionRequestCanceled(request)
        // 移除多余的deny调用
    }
}

4. 补充WebView设置(可选)

如果网页涉及混合内容(HTTPS页面加载HTTP资源),可以添加以下设置确保兼容性:

settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW

完成以上修改后,WebView应该可以正常调用相机实现文档扫描功能。

内容的提问来源于stack exchange,提问作者Kee Rushar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:22