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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:07:27