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
相关产品推荐
相关产品推荐

