Android WebView内JsQRScanner无法工作 浏览器运行摄像头正常
解决方案
你现有配置缺少安卓运行时权限申请和部分WebView必要配置,按以下步骤修改即可:
- 主动申请安卓系统层摄像头动态权限
Android 6.0(API 23)以上仅在Manifest声明权限无效,必须在加载WebView前向用户申请运行时权限,示例代码:
// 放在onCreate里加载WebView之前执行 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100); } else { // 已经有权限,直接初始化加载WebView initWebView(); } // 重写权限申请结果回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initWebView(); } else { Toast.makeText(this, "需要摄像头权限才能扫码", Toast.LENGTH_SHORT).show(); } } }
其中initWebView()方法内放你原有的WebView初始化逻辑。
- 补充WebSettings缺失配置
在你现有的WebSettings配置中添加以下代码:
// 允许媒体播放不需要用户手势,适配摄像头自动启动逻辑 webSettings.setMediaPlaybackRequiresUserGesture(false); // 允许访问本地文件与内容资源 webSettings.setAllowFileAccess(true); webSettings.setAllowContentAccess(true); // 适配HTTPS混合内容场景,避免资源加载失败 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); }
- 修改AndroidManifest.xml配置
添加摄像头硬件特性声明,避免部分机型识别不到可用摄像头:
<uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" />
- 调整WebChromeClient权限申请逻辑
确保权限申请操作在UI线程执行,避免部分系统版本调用失败:
webView.setWebChromeClient(new WebChromeClient() { @Override public void onPermissionRequest(final PermissionRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { runOnUiThread(() -> request.grant(request.getResources())); } } });
额外排查点
如果按以上配置仍无法调用摄像头,可在AndroidManifest.xml对应的Activity标签中开启硬件加速:
<activity android:name=".MainActivity" android:hardwareAccelerated="true"> </activity>
内容的提问来源于stack exchange,提问作者Sapta Ahmad Afrizal
相关产品推荐
相关产品推荐

