Служба android java mediaplayer – как узнать, подготовлен ли mediaPlayer?

Я сделал связанную службу с элементами управления MediaPlayer, которые загружают и воспроизводят звук. Но бывает так, что иногда mediaPlayer.prepare(); недостаточно быстр и не всегда готов к воспроизведению.

Итак, как я могу сделать такой метод, что-то вроде myService.prepare(), где я могу попросить MediaPlayer подготовиться и дождаться его?


person user2234594    schedule 05.08.2013    source источник
comment
prepare() должен быть синхронным и блокироваться до тех пор, пока он не будет завершен, prepareAsync() - это то, что может вызвать вашу проблему.   -  person Robadob    schedule 05.08.2013
comment
ну, я просто использую prepare(), но часто получаю недопустимое исключение. Я не использую prepareAsync ... Если он блокируется - почему я время от времени получаю это недопустимое исключение?   -  person user2234594    schedule 05.08.2013


Ответы (1)


Вы можете подождать, пока событие OnPrepared будет запущено MediaPlayer.

http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html

Изменить: prepare() блокирует только файлы, поэтому, если вы работаете с чем-то другим, это может быть причиной.

person nioKi    schedule 05.08.2013
comment
да, я это знаю, но как я могу узнать из активности, подготовлен ли уже mediaPlayer или нет? мой MediaPlayer находится в службе, и я должен подготовить его одним методом (в действии) - person user2234594; 05.08.2013
comment
Я работаю с файлами на SD-карте - метод mediaPlayer.setDataSource(). Я полагаю, это считается для файлов? Как ни странно, тот же файл может получить недопустимое исключение с помощью prepare() - person user2234594; 05.08.2013
comment
Не уверен, что понимаю вашу проблему: я думаю, вы можете использовать логическое значение, инициализированное значением false, и установить для него значение true в обратном вызове. Когда вам нужно запросить состояние MediaPlayer, просто отправьте логическое значение в свою активность? - person nioKi; 05.08.2013
comment
Возможно... но у меня есть что-то вроде audioService.prepare(); аудиосервис.старт(); если я поставлю что-то посередине, чтобы дождаться, когда логическое значение станет истинным, я как бы заблокирую свою активность, и я узнал, что это плохо - person user2234594; 05.08.2013
comment
Если служба удерживает MediaPlayer, то только ваша служба сможет определить, готов ли MediaPlayer к воспроизведению. Вы можете отправить сообщение в свою активность, когда это так. Есть много способов сделать это, самый простой — использовать широковещательные сообщения. - person nioKi; 05.08.2013
comment
может быть.. но это так усложняет.. В коде так много мест, где я вызываю подготовку.. хорошо.. спасибо за ответ - person user2234594; 05.08.2013