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

