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

Jetpack Compose中ExoPlayer横屏模式自动切竖屏问题求助

问题解决方案

问题根源

ExoPlayer在视频播放时会自动尝试调整屏幕方向以匹配视频宽高比,这会覆盖你通过LockScreenOrientation设置的强制横屏,导致屏幕转回竖屏。

解决步骤

1. 优化屏幕方向锁定逻辑

修改LockScreenOrientation,确保在Composable生命周期内持续锁定方向,防止被其他代码覆盖:

@Composable
fun LockScreenOrientation(orientation: Int) {
    val context = LocalContext.current
    val activity = remember(context) { context.findActivity() }

    // 持续检查并维持目标方向
    LaunchedEffect(orientation, activity) {
        activity?.let { targetActivity ->
            while (true) {
                if (targetActivity.requestedOrientation != orientation) {
                    targetActivity.requestedOrientation = orientation
                }
                delay(100)
            }
        }
    }

    // 退出时恢复原方向
    DisposableEffect(activity) {
        val originalOrientation = activity?.requestedOrientation
        onDispose {
            activity?.requestedOrientation = originalOrientation
        }
    }
}

2. 拦截ExoPlayer的自动方向调整

在VideoView中添加播放状态监听,当视频开始播放时重新锁定横屏,确保方向不会被ExoPlayer修改:

@Composable
fun VideoView() {
    val context = LocalContext.current
    val exoPlayer = remember {
        ExoPlayer.Builder(context)
            .build()
            .apply {
                setMediaItem(
                    MediaItem.Builder()
                        .setUri("https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
                        .setMediaMetadata(MediaMetadata.Builder().build())
                        .build()
                )
                prepare()
                playWhenReady = true
            }
    }

    // 监听播放状态,就绪时重新锁定横屏
    LaunchedEffect(exoPlayer) {
        exoPlayer.addListener(object : Player.Listener {
            override fun onPlaybackStateChanged(playbackState: Int) {
                super.onPlaybackStateChanged(playbackState)
                if (playbackState == Player.STATE_READY) {
                    context.findActivity()?.apply {
                        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                    }
                }
            }
        })
    }

    DisposableEffect(Unit) {
        onDispose { exoPlayer.release() }
    }

    AndroidView(factory = {
        PlayerView(context).apply {
            player = exoPlayer
            useController = false
            layoutParams = FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
        }
    })
}

3. 修改Activity配置(可选但推荐)

在AndroidManifest.xml中给主Activity添加configChanges属性,避免方向变化导致Activity重建,丢失方向设置:

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="orientation|screenSize">
    <!-- 其他配置 -->
</activity>

这样修改后,视频页面会保持横屏状态,不会在播放开始后转回竖屏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:55:40