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

Ошибка Android MediaPlayer при использовании вызовов reset() и release()

Ошибка, которую я вижу, связана с вызовами reset() и release(), которые никогда не возвращаются, тем самым оставляя мое приложение в состоянии бесконечной остановки. Не имеет значения, если я вызову stop() до reset() или release(), всегда можно воспроизвести повесить.

Кто-нибудь сталкивался с подобными проблемами при блокировке MediaPlayer? Какие-нибудь советы? Я работаю над многопоточным приложением.

DDMS сообщает следующее при просмотре поддерживаемых потоков:

КЛАСС | МЕТОД | FILE | LINE | NATIVE

android.media.MediaPlayer _release MediaPlayer.java -2 true
android.media.MediaPlayer release MediaPlayer.java 1049 false

4b9b3361

Ответ 1

Возможно, вы наткнулись на эту ошибку: http://code.google.com/p/android/issues/detail?id=959. Некоторое время он сидел, я бы не ожидал, что он будет рассмотрен в ближайшее время, к сожалению.

Ответ 2

Если вы разрабатываете для уровня API 16 или выше, я настоятельно рекомендую вам бросить crappy MediaPlayer и использовать Exoplayer от Google.

Я сделал и никогда не оглядывался назад. Поскольку я также поддерживаю API-уровень 15, у меня есть абстракция, чтобы использовать стандартный MediaPlayer, когда в этом API и Exoplayer, когда в 16 (или 17 сейчас не помню).

Это не идеально, но это намного лучше, и я видел намного лучшую буферизацию.

Ответ 3

Я также сталкиваюсь с этой проблемой в Android 2.2 при вызове MediaRecorder.release();

Когда-то это не было ответом, мой поток программы просто застрял на нем. это заставляет меня замораживать пользовательский интерфейс и позже передавать ANR....

Кстати, мой клиент говорит, что они не сталкивались с этим при использовании Android 2.3.3

Это: http://code.google.com/p/android/issues/detail?id=959#makechanges

И это: http://code.google.com/p/android/issues/detail?id=5047#makechanges

Ответ 4

Если вы просто пытаетесь начать песню/звук с самого начала, вы можете написать функцию reset, которая просто выполняет:

mediaplayer.seekTo(0);

Я изменил свой stop(); на: pause, а затем seekTo.