Jetpack Compose中ExoPlayer无法程序化暂停的问题求助
问题分析与解决
核心问题
- ExoPlayer实例未用
remember保存:Compose重组时会重新创建新的ExoPlayer实例,导致LaunchedEffect操作的是旧实例,而界面绑定的是新实例,暂停指令无法作用到当前播放的实例上。 - DisposableEffect的Key设置错误:将
AndroidView作为Key会导致DisposableEffect频繁触发,无法正确管理ExoPlayer的生命周期。 - 重复设置
playWhenReady:在AndroidView的factory中再次设置playWhenReady = true,可能覆盖LaunchedEffect中的暂停操作。
修复后的代码
// 用remember保存ExoPlayer,避免重组时重复创建实例 val exoPlayer = remember { ExoPlayer.Builder(context).build().apply { val mediaItem = MediaItem.Builder() .setUri("https://your-valid-video-url.mp4") // 替换为有效视频URI .build() setMediaItem(mediaItem) prepare() playWhenReady = true } } // 管理ExoPlayer生命周期,仅在实例销毁时释放资源 DisposableEffect(exoPlayer) { onDispose { exoPlayer.release() } } // 播放器视图 AndroidView( factory = { StyledPlayerView(context).apply { hideController() useController = false player = exoPlayer exoPlayer.videoScalingMode = C.VIDEO_SCALING_MODE_DEFAULT // 移除重复的playWhenReady设置 } } ) // 程序化暂停/恢复逻辑 LaunchedEffect(shouldShowValidator) { exoPlayer.playWhenReady = !shouldShowValidator // 也可以用pause()/play()实现,效果等价: // if (shouldShowValidator) exoPlayer.pause() else exoPlayer.play() }
额外说明
- ExoPlayer的
pause()方法会自动将playWhenReady设为false,play()会将其设为true,两种实现方式二选一即可。 - 确保视频URI格式正确,需为完整的HTTP/HTTPS地址或本地文件URI,否则播放器无法正常加载媒体内容。
内容的提问来源于stack exchange,提问作者MohammadBaqer
相关产品推荐
相关产品推荐

