Подтвердить что ты не робот

Android mediaPlayer - есть ли метод isPrepared() или getStatus()?

У меня проблемы с Android MediaPlayer. Похоже, что у него отсутствует важная функциональность, главным образом способ получить текущий статус MediaPlayer или узнать, подготовлен ли он. Я знаю, что есть готовый слушатель, но MediaPlayer длится дольше, чем Activity, поэтому, когда Playing Activity будет возобновлено, было бы неплохо получить текущее состояние проигрывателя, независимо от того, пытается ли он загружать носитель, загружается ли носитель и т.д. Я что-то упустил, или мне нужно следить за состоянием игрока?

Другие функциональные возможности, которые были бы хороши, были бы onPlayStateChanged() - мне в настоящее время нужно отслеживать состояние воспроизведения вручную. Я делаю это неправильно?

4b9b3361

Ответ 1

Надеюсь, что это не слишком поздно для ответа. Класс MediaPlayer не имеет такой функции, как метод isPrepared() или getStatus(), и вы должны сами отслеживать его состояние. Однако это не так сложно.

Класс MediaPlayer имеет хорошую диаграмму состояний, которая действительно помогает. Вы должны реализовать свою услугу на основе этой диаграммы. Кроме того, если вы всегда контролируете объект MediaPlayer из того же потока, легко отслеживать его состояние, поэтому я рекомендую вам это сделать. Метод prepareAsync() является единственным асинхронным методом, о котором вам нужно позаботиться, но вы можете сохранить логическое значение, указывающее на то, что игрок готовится, что будет "истинным" из вызова prepareAsync() до тех пор, пока onPrepared() не будет называется. В любом случае вы всегда можете реализовать onError и поймать IllegalStateException, чтобы избежать сбоев, если вы случайно вызываете какой-либо метод из незаконного состояния.

Тем не менее, руководство по воспроизведению мультимедиа мне очень помогло.

Ответ 2

Мне нужно было увидеть статус во время отладки, чтобы устранить проблему, поэтому я просто разместил этот код где-то после того, как я знал, что MediaPlayer был подготовлен:

try {
    this.audioPlayer.prepare();
} catch (Exception e) {
}

Это выводит на консоль ошибку, например "E/MediaPlayer: prepareAsync, вызываемый в состоянии 32".

Теперь, если бы я мог просто найти место, где перечислены все коды состояния...

Ответ 3

Нет класса getState класса MediaPlayer, но внутренне он имеет состояние, как объяснено alex.magellan. Вызов методов в "недопустимых состояниях" приводит к исключению.

Чтобы избежать этого, я создал StateMachine с классом MediaPlayerWrapper. Поэтому вместо непосредственного вызова MediaPlayer используется MediaPlayerWrapper, который внутренне обновляет StateMachine и предоставляет getState().

Реализации классов StateMachine и Wrapper можно найти здесь.