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

Android Compose WebView无法全屏播放视频的解决方法咨询

解决WebView中YouTube视频无法全屏的问题

要让WebView里的YouTube视频正常触发全屏,核心是自定义WebChromeClient处理全屏回调,同时结合Compose的状态管理切换全屏布局。以下是具体实现步骤:

1. 维护全屏状态

在Compose组件中添加状态变量,控制全屏模式的切换:

val isFullScreen = remember { mutableStateOf(false) }
val fullScreenView = remember { mutableStateOf<View?>(null) }
val customViewCallback = remember { mutableStateOf<WebChromeClient.CustomViewCallback?>(null) }

2. 自定义WebChromeClient处理全屏事件

替换默认的WebChromeClient(),重写全屏相关方法处理视图显示与隐藏:

it.webChromeClient = object : WebChromeClient() {
    override fun onShowCustomView(view: View, callback: WebChromeClient.CustomViewCallback) {
        super.onShowCustomView(view, callback)
        // 切换至全屏状态
        isFullScreen.value = true
        fullScreenView.value = view
        customViewCallback.value = callback
        // 隐藏系统UI,实现沉浸式全屏
        (context as Activity).window.apply {
            decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
            setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
        }
    }

    override fun onHideCustomView() {
        super.onHideCustomView()
        // 退出全屏状态
        isFullScreen.value = false
        fullScreenView.value?.visibility = View.GONE
        customViewCallback.value?.onCustomViewHidden()
        // 恢复系统UI
        (context as Activity).window.apply {
            decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
            clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
        }
    }
}

3. 适配Compose布局切换

根据全屏状态,在Compose中切换显示WebView或全屏视频视图:

if (isFullScreen.value) {
    fullScreenView.value?.let { view ->
        AndroidView(
            factory = { view },
            modifier = Modifier.fillMaxSize()
        )
    }
} else {
    WebView(
        state = webViewState,
        navigator = navigator,
        modifier = Modifier.fillMaxSize(),
        onCreated = { /* 保留你原有的WebView配置 */ }
    )
}

4. 补充Activity配置检查

确保你的Activity在Manifest中已配置:

<activity
    android:name=".YourActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:resizeableActivity="true"
    android:supportsPictureInPicture="true">
</activity>

关键说明

  • onShowCustomView会在YouTube触发全屏时被调用,此时需要替换视图为全屏显示并隐藏系统UI。
  • onHideCustomView处理退出全屏逻辑,恢复原有WebView和系统UI状态。
  • Compose中通过AndroidView承载原生视频视图,实现跨平台视图的切换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:32:49