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

Jetpack Compose中ExoPlayer无法程序化暂停的问题求助

问题分析与解决

核心问题

  1. ExoPlayer实例未用remember保存:Compose重组时会重新创建新的ExoPlayer实例,导致LaunchedEffect操作的是旧实例,而界面绑定的是新实例,暂停指令无法作用到当前播放的实例上。
  2. DisposableEffect的Key设置错误:将AndroidView作为Key会导致DisposableEffect频繁触发,无法正确管理ExoPlayer的生命周期。
  3. 重复设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:55:37