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

Android 6 WebView加载YouTube视频全屏模式崩溃问题求助

解决Android 6上WebView加载YouTube嵌入视频全屏崩溃问题

看起来你遇到的核心问题是Android 6设备上WebView处理YouTube视频全屏时触发的Resources$NotFoundException,最终导致Chromium崩溃。结合Logcat和你的代码,我整理了几个针对性的修复方案:

问题根源分析

Logcat里的String resource ID #0x2040005是Chromium WebView内部依赖的字符串资源,在Android 6的旧版WebView中,当页面来自非安全源(比如loadData默认的file://协议)时,会出现资源加载异常,进而触发崩溃。同时你看到的requestFullscreen() is deprecated on insecure origins警告也印证了源的问题。

修复方案

1. 替换loadData为loadDataWithBaseURL

这是解决问题的核心:把加载的HTML内容的基准URL设置为YouTube的HTTPS地址,让WebView认为页面来自安全源,既解决全屏API的警告,也能避免内部资源加载失败。

修改你的加载代码:

webView=(WebView)findViewById(R.id.webview);
webView.setWebChromeClient(new MyCrome());
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true); // 启用DOM存储,提升视频兼容性
settings.setMediaPlaybackRequiresUserGesture(false); // 可选:允许自动播放

String videourl="<html><body>"+description+"<br><iframe width=\"100%\" height=\"90%\" src=\"https://www.youtube.com/embed/"+videoid+"\" frameborder=\"0\" allowfullscreen></iframe></body></html>";
// 关键:指定YouTube的HTTPS地址作为基准URL
webView.loadDataWithBaseURL("https://www.youtube.com/", videourl, "text/html", "utf-8", null);

2. 优化WebChromeClient的全屏处理逻辑

把硬编码的系统UI数值替换为官方常量,同时简化代码逻辑提升稳定性:

public class MyCrome extends WebChromeClient {
    private View mCustomView;
    private CustomViewCallback mCustomViewCallback;
    private int mOriginalOrientation;
    private int mOriginalSystemUiVisibility;

    @Override
    public Bitmap getDefaultVideoPoster() {
        return Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888);
    }

    @Override
    public void onHideCustomView() {
        if (mCustomView == null) return;

        FrameLayout decorView = (FrameLayout) HowtoActivity.this.getWindow().getDecorView();
        decorView.removeView(mCustomView);
        mCustomView = null;

        decorView.setSystemUiVisibility(mOriginalSystemUiVisibility);
        HowtoActivity.this.setRequestedOrientation(mOriginalOrientation);
        mCustomViewCallback.onCustomViewHidden();
        mCustomViewCallback = null;
    }

    @Override
    public void onShowCustomView(View paramView, CustomViewCallback paramCustomViewCallback) {
        if (mCustomView != null) {
            onHideCustomView();
            return;
        }

        mCustomView = paramView;
        mCustomView.setBackgroundColor(Color.BLACK);
        mOriginalSystemUiVisibility = HowtoActivity.this.getWindow().getDecorView().getSystemUiVisibility();
        mOriginalOrientation = HowtoActivity.this.getRequestedOrientation();
        mCustomViewCallback = paramCustomViewCallback;

        FrameLayout decorView = (FrameLayout) HowtoActivity.this.getWindow().getDecorView();
        decorView.addView(mCustomView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        // 使用官方常量替代硬编码数值,提升兼容性
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        );
    }
}

3. 确保硬件加速开启

WebView视频播放依赖硬件加速,检查你的AndroidManifest.xml中对应Activity是否开启:

<activity
    android:name=".HowtoActivity"
    android:hardwareAccelerated="true">
</activity>

4. 更新Android 6设备的WebView组件

Android 6的WebView是可通过Google Play更新的独立组件,旧版本可能存在已知的资源加载bug,建议测试设备更新WebView到最新版本。

为什么这些修改有效

通过指定安全的基准URL,WebView会将页面识别为来自HTTPS源,解决了全屏API的兼容性问题,同时避免了旧版WebView在跨源场景下的资源加载异常,从根源上阻止了Resources$NotFoundException和后续的Chromium崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:52:24