Android WebView中摄像头调用失败问题的排查与解决
解决方案
1. 补充动态权限申请
Android 6.0(API 23)及以上,摄像头属于危险权限,仅在Manifest中声明权限不足以让应用获取权限,必须在运行时动态申请。
在你的Activity中添加以下权限申请逻辑:
private static final int REQUEST_CAMERA_PERMISSION = 100; // 可在初始化WebView前或触发摄像头功能时调用 private void requestCameraPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CAMERA_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { webView.reload(); } else { Toast.makeText(this, "需要摄像头权限才能使用该功能", Toast.LENGTH_SHORT).show(); } } }
2. 配置WebView核心参数
确保WebView启用了摄像头功能所需的基础设置:
WebSettings webSettings = webView.getSettings(); // 启用JavaScript(网页端摄像头逻辑依赖JS) webSettings.setJavaScriptEnabled(true); // 启用DOM存储API(部分网页摄像头功能依赖) webSettings.setDomStorageEnabled(true); // 允许媒体自动加载(避免需用户手动触发摄像头预览) webSettings.setMediaPlaybackRequiresUserGesture(false);
3. 设置WebChromeClient处理权限请求
WebView需要通过WebChromeClient的回调处理网页的摄像头权限请求,否则网页无法获取系统权限:
webView.setWebChromeClient(new WebChromeClient() { @Override public void onPermissionRequest(PermissionRequest request) { for (String permission : request.getResources()) { if (permission.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) { request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE}); return; } } super.onPermissionRequest(request); } });
4. 处理HTTPS/明文流量限制
如果你的网页使用HTTP协议,Android 7.0(API 24)及以上默认禁止明文流量,需在AndroidManifest.xml的application标签中添加:
<application ... android:usesCleartextTraffic="true"> ... </application>
优先建议改用HTTPS协议,规避明文流量的安全风险。
5. 适配Android版本差异
- Android 10(API 29)及以上:如果网页仅使用摄像头预览/拍摄,无需申请
WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,可直接移除Manifest中的相关声明。 - Android 11(API 30)及以上:确保应用未被系统限制摄像头权限,可前往系统设置的应用权限页面手动检查。
6. 排查额外问题
- 确认网页的摄像头调用代码基于标准
getUserMediaAPI(网页端正常则大概率无问题)。 - 检查设备WebView版本:旧版WebView可能存在媒体API支持缺陷,可通过更新Chrome浏览器(WebView与Chrome共享内核)解决。
内容的提问来源于stack exchange,提问作者Pushkar Jain
相关产品推荐
相关产品推荐

