Android - обнаружение конца потока, а не ошибка подключения в MediaPlayer

Во время прослушивания 1-часового mp3-потока, если пользователь теряет соединение (или переключается с WIFI на 3G и соединение «падает» на секунду), мы заметили, что MediaPlayer продолжает воспроизводить контент, который он буферизировал. Как только он исчерпает буферизованное содержимое, если он не будет завершен до конца файла, я бы предположил, что он запускает событие Error, но вместо этого он меняет состояние на PLAYBACK_COMPLETE. Как мы можем выяснить, произошло ли окончание воспроизведения из-за ошибки в соединении (потеря соединения) или из-за фактического завершения воспроизведения? Единственное, что мне удалось придумать, это сравнить currentPostion и totalDuration, когда MediaPlayer меняет состояние на PLAYBACK_COMPLETE. Есть ли способ лучше?


person StackOverflowed    schedule 08.11.2012    source источник


Ответы (3)


Если он не вызвал событие onError(), вы можете попробовать зарегистрироваться OnBufferingUpdateListener и проверьте, достигает ли процент буферизации 100%. Если соединение потеряно, по завершении воспроизведения процент будет меньше 100%.

person Dheeraj Vepakomma    schedule 10.01.2013
comment
Проблема с использованием процента буфера (кроме различий в реализации устройств) заключается в том, что это MP3 с большой продолжительностью (1-3 часа и более), а процент буфера почти всегда меньше 100%. - person StackOverflowed; 10.01.2013
comment
@StackOverflowed Вы имеете в виду, что даже когда буферизация завершена, вы не получаете 100% в обратном вызове OnBufferingUpdateListener? - person Dheeraj Vepakomma; 10.01.2013
comment
Я имею в виду, что если mp3 длится 5 часов, он может быть буферизован 4 часа в mp3, когда происходит потеря сетевого подключения. - person StackOverflowed; 15.01.2013
comment
@StackOverflowed Точно. Таким образом, в этом случае последний вызов OnBufferingUpdateListener будет меньше 100%, что указывает на потерю сети после завершения воспроизведения. Он должен достигать 100% только в том случае, если буферизация завершена. Я не понимаю проблемы с этим методом, который вы пытаетесь объяснить. - person Dheeraj Vepakomma; 15.01.2013
comment
Я говорю, что естественно, что буферизация не достигает 100%, пока не возникнет проблема с сетью. - person StackOverflowed; 15.01.2013
comment
Награда подходила к концу, поэтому я присудил ее вам, хотя никто полностью не ответил на мой вопрос (почему может быть неразрешимым). - person StackOverflowed; 17.01.2013

Это действительно трудно узнать. Я думаю, что ваш подход currentPosition и totalDuration великолепен, но я предлагаю вам также прослушивать состояние сети устройства. Если соединение с сервером обрывается из-за клиента, вы можете узнать об этом таким образом. Это может помочь

person Alpay    schedule 16.01.2013

Вы должны убедиться, что у вас есть OnErrorListener, реализованный и внутри этот метод onError вы должны вернуть истинное значение. Если вы возвращаете ложное значение из этого метода, но произошла ошибка, в этом случае медиаплеер запускает OnCompletionListener метод onCompletion.

person Shamim Ahmmed    schedule 16.01.2013