UnityPlayerActivity中Android WebView播放YouTube视频异常求助
Unity Android WebView 加载YouTube视频黑屏/白屏问题解决办法
问题说明
在Unity里通过AndroidJavaProxy调用Java代码实现WebView加载YouTube页面:
- 调用
WebViewAndroid.Instance.AddWebViewInSameActivity("https://www.youtube.com")在默认UnityPlayerActivity中加载,WebView能正常显示页面,但点击视频会出现黑屏或白屏; - 调用
WebViewAndroid.Instance.AddWebViewInNewActivity("https://www.youtube.com")在新建的独立Activity中加载,视频播放完全正常。
推测问题出在UnityPlayerActivity中的UnityPlayer组件与WebView的渲染/生命周期冲突。
可行解决方案
1. 修正WebView硬件加速与视频播放配置
UnityPlayer默认启用硬件加速,容易和WebView的视频渲染逻辑冲突,在Java层添加以下配置:
// 开启WebView硬件加速 webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); // 允许无需用户手势自动播放视频(YouTube需要) webView.getSettings().setMediaPlaybackRequiresUserGesture(false); // 确保WebView启用必要的Web特性 webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(true);
同时检查Unity打包后的AndroidManifest.xml,确认UnityPlayerActivity开启硬件加速:
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:hardwareAccelerated="true">
2. 处理UnityPlayer与WebView的生命周期冲突
UnityPlayer会抢占窗口焦点和生命周期回调,导致WebView视频渲染异常,在Java层通过WebChromeClient监听视频播放状态,同步暂停/恢复UnityPlayer:
webView.setWebChromeClient(new WebChromeClient() { @Override public void onShowCustomView(View view, CustomViewCallback callback) { // 视频开始播放时暂停Unity渲染 UnityPlayer.currentActivity.runOnUiThread(() -> UnityPlayer.pause()); super.onShowCustomView(view, callback); } @Override public void onHideCustomView() { // 视频结束播放后恢复Unity渲染 UnityPlayer.currentActivity.runOnUiThread(() -> UnityPlayer.resume()); super.onHideCustomView(); } });
3. 调整WebView的窗口层级
将WebView的层级设为顶层,避免被Unity的渲染层遮挡视频画面:
webView.setZOrderOnTop(true); webView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
注意:设置后如果需要显示Unity UI,可能需要调整WebView的可见性或层级,按需切换。
4. 自定义UnityPlayerActivity布局
默认UnityPlayerActivity中UnityPlayer占据整个窗口,直接添加WebView会导致渲染层级混乱。可以自定义Activity布局,将UnityPlayer和WebView放入同一个布局容器,明确布局参数,确保WebView在视频播放时能获取焦点:
<!-- 自定义UnityPlayerActivity布局示例 --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.unity3d.player.UnityPlayer android:id="@+id/unity_player" android:layout_width="match_parent" android:layout_height="match_parent"/> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"/> </RelativeLayout>
在Java代码中控制WebView的显示/隐藏,确保视频播放时WebView处于可见且焦点状态。
内容的提问来源于stack exchange,提问作者Amit Hooda
相关产品推荐
相关产品推荐

