Я хочу создать что-то вроде звукового пейзажа.Для этого у меня есть сервис, в котором созданы три экземпляра MediaPlayer.По завершении они должны выбрать новый файл для воспроизведения, воспроизвести этот файл и повторить этот процесс.
Следующий код воспроизводит файлы только из .create()
, но, похоже, больше ничего не делает.Во время выполнения печатаются «selectstarted» и «playstarted», поэтому я могу только догадываться, что ошибка где-то в функции selectBordun()
или play()
, но я понятия не имею, где.
Обратите вниманиечто я сократил код для удобства чтения.Каждый раз, когда упоминается mPlayer
, у меня есть один и тот же код еще два раза, только с mPlayer2
и mPlayer3
.Но основной принцип должен быть одинаковым только с одним экземпляром.
open class BordunService : Service() {
private lateinit var mPlayer: MediaPlayer
override fun onCreate() {
mPlayer = MediaPlayer.create(this, R.raw.fping)
}
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
if (intent.hasExtra("Play")) {
playBordun()
}
}
private fun playBordun() {
fun playMPlayer() {
mPlayer.setOnCompletionListener(object: MediaPlayer.OnCompletionListener {
override fun onCompletion(p0: MediaPlayer?) {
println("completem")
selectBordun(mPlayer)
}
})
mPlayer.setOnPreparedListener(object:MediaPlayer.OnPreparedListener {
override fun onPrepared(p0: MediaPlayer?) {
println("preparedm")
mPlayer.start()
}
})
}
GlobalScope.launch {
playMPlayer()
}
}
fun selectBordun(player: MediaPlayer) {
println("selectstarted")
player.reset()
val randomGenerator = Random()
val bordunInt = randomGenerator.nextInt(3) + 1
when (bordunInt) {
1 -> {
val afd = this.getResources().openRawResourceFd(R.raw.cping)
afd.close()
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength())
// player.prepareAsync()
play(player)
}
2 -> {
val afd = this.getResources().openRawResourceFd(R.raw.ebping)
afd.close()
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength())
// player.prepareAsync()
play(player)
}
3 -> {
val afd = this.getResources().openRawResourceFd(R.raw.gping)
afd.close()
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength())
// player.prepareAsync()
play(player)
}
}
}
fun play(player: MediaPlayer) {
println("playstarted")
player.setOnPreparedListener(object:MediaPlayer.OnPreparedListener {
override fun onPrepared(p0: MediaPlayer?) {
println("preparedplayer")
player.start()
}
})
player.setOnCompletionListener(object: MediaPlayer.OnCompletionListener {
override fun onCompletion(p0: MediaPlayer?) {
println("completeplayer")
selectBordun(player)
}
})
}
}