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

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. 排查额外问题

  • 确认网页的摄像头调用代码基于标准getUserMedia API(网页端正常则大概率无问题)。
  • 检查设备WebView版本:旧版WebView可能存在媒体API支持缺陷,可通过更新Chrome浏览器(WebView与Chrome共享内核)解决。

内容的提问来源于stack exchange,提问作者Pushkar Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:15:52