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

Android WebView摄像头视频流自动播放失效问题求助

Android WebView本地HTML摄像头视频无需手势持续自动播放解决方案

核心问题根源

你遇到的半秒后暂停问题,本质是Android WebView对自动播放的额外限制——即使关闭了setMediaPlaybackRequiresUserGesture(false),非静音视频仍会被拦截;同时页面加载时的权限就绪时机、WebView焦点状态也会影响播放持续性。


步骤1:修正HTML的video标签配置

必须给video标签添加muted属性(WebView强制要求非交互触发的自动播放必须静音,后续可通过JS手动开启声音),同时加上playsinline避免视频强制全屏:

<video id="cameraVideo" autoplay playsinline muted width="100%" height="auto"></video>

步骤2:完善WebSettings配置

除已有的设置,补充关键配置确保本地页面和摄像头API正常工作:

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true); // 摄像头API依赖JS,必须开启
webSettings.setMediaPlaybackRequiresUserGesture(false); // 关闭手势播放限制
webSettings.setAllowFileAccess(true); // 允许访问本地文件
webSettings.setAllowContentAccess(true);
webSettings.setAllowUniversalAccessFromFileURLs(true); // 允许本地页面跨域调用摄像头API
webSettings.setDomStorageEnabled(true); // 开启DOM存储,部分摄像头API依赖
webView.requestFocus(); // 确保WebView获取焦点,避免播放被焦点拦截

步骤3:优化WebChromeClient的权限与播放触发

提前处理权限请求,同时在页面加载完成后主动触发播放,避免WebView自动播放时机失效:

webView.setWebChromeClient(new WebChromeClient() {
    // 授予WebView摄像头权限请求
    @Override
    public void onPermissionRequest(PermissionRequest request) {
        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            request.grant(request.getResources());
        }
    }

    // 页面加载完成后主动调用视频播放
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 注入JS强制触发播放,覆盖WebView的自动播放延迟问题
        view.loadUrl("javascript:document.getElementById('cameraVideo').play().catch(err => console.log(err));");
    }
});

步骤4:确保权限提前就绪

必须在加载WebView页面之前完成摄像头权限的动态申请,避免页面加载时权限未就绪导致播放中断:

// 页面初始化时检查权限
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView webView = findViewById(R.id.webview);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1001);
    } else {
        loadCameraPage(webView);
    }
}

// 权限申请回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1001 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        loadCameraPage(findViewById(R.id.webview));
    }
}

// 加载assets目录下的HTML页面
private void loadCameraPage(WebView webView) {
    webView.loadUrl("file:///android_asset/camera.html");
}

额外注意事项

  • 若需要音频采集,需额外申请Manifest.permission.RECORD_AUDIO权限,并在video标签添加audio="true"。
  • Android 12及以上版本,需确保权限申请逻辑适配新的权限模型。
  • 避免WebView被其他View遮挡或处于不可见状态,否则播放会被系统暂停。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:17:33