Как я могу получить текущую продолжительность из медиаплеера для отображения на индикаторе выполнения песни?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу получить текущую продолжительность из медиаплеера для отображения на индикаторе выполнения песни?

Сообщение Anonymous »

Я испробовал все возможные шаги, но дал значение только один раз, я хочу, чтобы оно обновлялось каждую секунду. это мой код, где я делаю неправильно?
я хочу внедрить слайдер прогресса для музыки, кто-нибудь может мне помочь?
здесь я использую библиотеку слайдеров, диапазон которой вы принимаете в этой библиотеке: от текущей позиции до общей продолжительности.
data class MusicPlayerStates(
var playingSongCurrentPosition: MutableState = mutableIntStateOf(0),
var playingSongDuration: MutableState = mutableIntStateOf(0),

//other code
)

fun onEvent(event: MusicPlayerUiEvents) {
when (event) {

is MusicPlayerUiEvents.PlaySong -> {
mediaPlayer?.let {
if (it.isPlaying) {
mediaPlayer?.stop()
mediaPlayer?.reset()
_musicPlayerState.update { state ->
state.copy(
playingSongCurrentPosition = state.playingSongCurrentPosition.apply {
this.value = 0
},
playingSongDuration = state.playingSongDuration.apply {
this.value = 0
}
)
}
}
}
_musicPlayerState.update {
it.copy(
isSongPlaying = it.isSongPlaying.apply {
this.value = true
}
)
}
mediaPlayer?.release()
mediaPlayer = MediaPlayer().apply {
setDataSource(event.url)
prepareAsync()
}
mediaPlayer?.setOnPreparedListener { mediaPlayer ->
mediaPlayer.seekTo(state.value.playingSongCurrentPosition.value)
mediaPlayer.start()
setSongDuration(mediaPlayer.duration)
updatePlaybackState(mediaPlayer.currentPosition)

Log.d("check for currentD_VM","${state.value.playingSongCurrentPosition.value}")
}

mediaPlayer?.setOnCompletionListener { mediaPlayer ->
// Use for precise updates
mediaPlayer?.stop()
_musicPlayerState.update { state ->
state.copy(
playingSongCurrentPosition = state.playingSongCurrentPosition.apply {
this.value = 0
},
playingSongDuration = state.playingSongDuration.apply {
this.value = 0
},
isSongPlaying = state.isSongPlaying.apply {
this.value = false
},
)
}
}

}
}
}
}

private fun updatePlaybackState(currentPosition: Int) {
_musicPlayerState.update {
it.copy(
playingSongCurrentPosition = it.playingSongCurrentPosition.apply {
this.value = currentPosition
}
)
}
}

private fun setSongDuration(duration: Int) {
_musicPlayerState.update {
it.copy(
playingSongDuration = it.playingSongDuration.apply {
this.value = duration
}
)
}
}

Box(
modifier =
Modifier
.padding(vertical = 80.dp, horizontal = 20.dp)
.fillMaxWidth()
.height(20.dp)
) {
var fraction by remember { mutableFloatStateOf(1f) }
WavySlider(
valueRange = 1000f..state.playingSongDuration.value.toFloat(),
value = 1000f,
onValueChange = { },
waveLength = 25.dp, // Set this to 0.dp to get a regular Slider
waveHeight = 10.dp, // Set this to 0.dp to get a regular Slider
waveVelocity = 15.dp to WaveDirection.HEAD, // Speed per second and its direction
waveThickness = 4.dp, // Defaults to the specified trackThickness
trackThickness = 4.dp, // Defaults to 4.dp, same as regular Slider
incremental = false, // Whether to gradually increase waveHeight
// animationSpecs = ... // Customize various animations of the wave
)
}



Подробнее здесь: https://stackoverflow.com/questions/783 ... lay-on-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»