MediaPlayer завершает работу после паузы - PullRequest
4 голосов
/ 29 мая 2011

Недавно я заметил очень странную проблему с MediaPlayer при воспроизведении mp3-файла. Я запускаю этот код (mPlayer MediaPlayer):

Log.d(TAG, "Pausing");
try {
    mPlayer.pause();
    Log.d(TAG, "Paused");
} catch (IllegalStateException e) {
    Log.w(TAG, "exception pausing player");
}

Странная вещь заключается в том, что, если я близок к концу аудиофайла, проигрыватель отправляет уведомление о завершении на мой OnCompletionListener через короткое время после выполнения вышеуказанного кода. (Я точно не определил, насколько близко я должен быть, но он порядка 1/4 секунды.) Например, вот типичный вывод logcat, когда это происходит:

05-27 17:23:43.439: DEBUG/Player(266): Pausing
05-27 17:23:43.487: DEBUG/Player(266): Paused
05-27 17:23:43.838: WARN/Player(266): Audio completed (state=PAUSED)

Обратите внимание, что строка предупреждения (записанная с моего OnCompletionListener) приходит через 300 мс после возврата вызова pause()!

В результате медиаплеер переходит в состояние PlaybackCompleted, когда я этого не ожидаю. Это портит поведение моего кода (а также start(), который перезапускается с начала, а не проигрывает последний бит файла).

Это происходило на эмуляторах с 1.6 по 2.3 и хотя бы на одном устройстве с 2.2. Кто-нибудь знает об этой проблеме и что с этим делать?

1 Ответ

1 голос
/ 29 мая 2011

Медиаплеер работает в отдельном потоке, и вам нужно дождаться синхронизации потока пользовательского интерфейса и потока медиаплеера.Так что задержка нормальная.Вполне возможно, что игрок действительно завершает файл из-за того, что ваша команда паузы слишком поздно пришла к игроку.Попробуйте, что произойдет с более длинным аудиофайлом.

Другая проблема, которая может возникнуть, - это поиск другого кода за концом дорожки после команды pause.Какой код у вашего слушателя?

...