Как я могу попросить Android MediaPlayer не воспроизводиться после onPrepared?

Я работаю над приложением для Android, которое выполняет много параллелизма и RxJava в фоновом режиме, и по какой-то причине можно не хотеть воспроизводить музыку, которая находится на этапе асинхронной подготовки:

player.prepareAsync()

и

override fun onPrepared(mp: MediaPlayer?) {
    isPreparing = false

    if (playAfterPreparing) {
        //start playback
        mp?.start()
    } else {
        // don't play and keep it prepare for later!!!
    }

    updateNotification()
}

но проблема в том, что после подготовки вы должны играть (!), Потому что: Медиаплеер вызван в состоянии 0, ошибка (-38,0)

Я даже пытался запускать и останавливать один за другим в процессе подготовки:

override fun onPrepared(mp: MediaPlayer?) {
    Timber.i("onPrepared")
    Timber.i("playAfterPreparing: $playAfterPreparing")

    isPreparing = false

    //start playback
    mp?.start()

    if (!playAfterPreparing) {
        mp?.pause()
    }

    updateNotification()
}

но это не сработало, потому что это привело к той же проблеме.

Я также знаю, как работает конечный автомат MediaPlayer, но ничего не вижу в этой ситуации в документах: https://developer.android.com/reference/android/media/MediaPlayer.html

любое решение для такой ситуации?


person Mohsen Mirhoseini    schedule 02.03.2018    source источник
comment
after preparation you should play(!) нет. Ошибки не появляются, если вы не начнете воспроизведение при подготовке. Скорее всего, это вызвано какой-то другой причиной   -  person Vladyslav Matviienko    schedule 02.03.2018
comment
@VladyslavMatviienko это именно то поведение, которое я полагаю увидеть! но, как я уже упоминал в этом вопросе, в соответствии с этим ответом вызывается в состоянии 0, ошибка 38 0"> stackoverflow.com/questions/9008770/ Я всегда получаю ошибку -38!   -  person Mohsen Mirhoseini    schedule 02.03.2018
comment
Я все еще думаю, что вы получаете эту ошибку по какой-то другой причине. Никто не знает, что еще вы делаете со своим медиаплеером.   -  person Vladyslav Matviienko    schedule 02.03.2018
comment
хорошо, если вы так думаете, я напишу простое приложение только с одним MediaPlayer для тестирования.   -  person Mohsen Mirhoseini    schedule 02.03.2018
comment
@VladyslavMatviienko вы были правы! Я создаю очень простое приложение только с одним медиаплеером, и оно у меня сработало. Я изучу больше, что было именно моей проблемой, и опубликую ее здесь. Кстати, в моем приложении я использовал местную музыку, но в своем простом тесте я тестировал онлайн-трансляцию.   -  person Mohsen Mirhoseini    schedule 02.03.2018
comment
локальные VS онлайн не должны иметь значения   -  person Vladyslav Matviienko    schedule 02.03.2018
comment
@VladyslavMatviienko вы правы, спасибо за помощь   -  person Mohsen Mirhoseini    schedule 02.03.2018


Ответы (1)


Благодаря комментариям @VladyslavMatviienko я заподозрил, что где-то делаю что-то не так, и он был прав. Согласно документу Android MediaPlayer:

Диаграмма состояний Android MediaPlayer

Можно оставаться в состоянии Prepared, но невозможно вызвать какой-либо метод, а именно pause(), и это была моя ошибка. В состоянии Prepared Вы можете звонить только start(), seekTo() или stop().

Надеюсь, этот ответ пригодится тем, кто может столкнуться с этой проблемой позже.

person Mohsen Mirhoseini    schedule 02.03.2018