This code is needed to implement MediaPlayer functionality. Since the project itself is multiplatform.
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() Асинхронная подготовка MediaPlayer
}
}
}
I’ve removed the comments and some of the footers remain below. If there is a need I will add them by reply. Below is spam to put up a post.
qweqewqweqweqeqeqeqweqweqeqweqeqewqeqweqewqweqweqeqeqeqweqweqeqweqeqewqeqweqewqweqweqeqeqeqweqweqeqweqeqewqe
v
vqweqewqweqweqeqeqeqweqweqeqweqeqewqeqweqewqweqweqeqeqeqweqweqeqweqeqewqe