Код: Выделить всё
class AudioPlayerImp(private val client: HttpClient) : AudioPlayer {
private var mediaPlayer: MediaPlayer? = null
private var playerState: PlayerState = PlayerState.IDLE
override suspend fun play(audioUrl: String) {
stop()
val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
val fileName = audioUrl.split("/").last()
val filePath = "${downloadsDir.absolutePath}/$fileName"
val file = File(filePath)
if (!file.exists()) {
client.downloadAndSave(audioUrl, fileName)
return
}
mediaPlayer = MediaPlayer().apply {
setDataSource(filePath)
setOnPreparedListener {
setPlayerState(PlayerState.PREPARED)
// Начать воспроизведение после подготовки
if (getPlayerState() == PlayerState.PREPARED) {
start()
setPlayerState(PlayerState.PLAYING)
}
}
setOnBufferingUpdateListener { _, percent ->
if (getPlayerState() == PlayerState.COMPLETED || getPlayerState() == PlayerState.PAUSED) {
return@setOnBufferingUpdateListener
}
if (!isPlaying && percent >= 50) { // Порог буферизации в 50%
if (getPlayerState() == PlayerState.PREPARED) {
start()
setPlayerState(PlayerState.PLAYING)
}
}
}
setOnCompletionListener {
setPlayerState(PlayerState.COMPLETED)
}
setOnErrorListener { _, what, extra ->
setPlayerState(PlayerState.ERROR)
true Ошибка обработана
}
prepareAsync()
}
}
}
Код: Выделить всё
Expecting binder but got null!
initFromDataSource, cannot create extractor!
Failed to init from data source!
error (1, -2147483648)
Error (1,-2147483648)

Подробнее здесь: https://stackoverflow.com/questions/790 ... ediaplayer