根据 ExoPlayer 播放音频位置更新 Jetpack Compose Slider Progress

Update Jetpack Compose Slider Progress based on ExoPlayer playing audio position

我已经为音频文件播放器创建了自定义 UI,我正在使用 Exoplayer 获取文件并播放它。我没有为 exoplayer 使用自定义控制器,我的 UI 有一个需要根据当前音频位置更新的滑块。我怎样才能做到这一点?请帮忙。

  var currentValue by remember { mutableStateOf(0f) }
  currentValue = mediaPlayer.getCurrentPosition()
  Slider(
            modifier = Modifier.weight(1f),
            value = currentValue ,
            onValueChange = {currentValue = it },
            valueRange = 0f.. mediaPlayer.contentDuration()
        )
               

根据您的代码,您希望 mediaPlayer.getCurrentPosition() 以某种方式触发重组。

Compose 只能跟踪 State 对象更改,这是一种为触发重组而创建的特殊类型。

当您需要使用一些非Compose 库时,您需要搜索跟踪更改的方法。在大多数旧图书馆中,都有一些针对这种情况的听众。

ExoPlayer 的情况下没有直接的监听器。在此 issue you can see suggestion to use the listener to track isPlaying state. In Compose to work with listeners you can use DisposableEffect 中,因此当视图消失时,您可以删除侦听器。

然后在播放时 - 每隔一段时间重复调用 currentPosition。由于 Compose 是围绕协程构建的,因此使用 LaunchedEffect:

很容易做到
var currentValue by remember { mutableStateOf(0L) }
var isPlaying by remember { mutableStateOf(false) }

DisposableEffect(Unit) {
    val listener = object : Player.Listener {
        override fun onIsPlayingChanged(isPlaying_: Boolean) {
            isPlaying = isPlaying_
        }
    }
    mediaPlayer.addListener(listener)
    onDispose {
        mediaPlayer.removeListener(listener)
    }
}
if (isPlaying) {
    LaunchedEffect(Unit) {
        while(true) {
            currentValue = mediaPlayer.currentPosition
            delay(1.seconds / 30)
        }
    }
}