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
相关产品推荐
相关产品推荐

