Мне нужно упустить что-то очевидное здесь, но я не могу найти ничего, что позволило бы мне определить, когда MediaPlayer буферизует звук. Я потоковый интернет-аудио, и я хочу отображать индикатор буферизации, но ничего, что я пробовал, позволяет мне знать, когда MediaPlayer прерывает звук для буферизации, поэтому я не могу правильно отображать индикатор буферизации. Любые подсказки?
Android - Как сказать, когда MediaPlayer является буферизацией
Ответ 1
@Daniel, за ваш комментарий к ответу @JRL, вы, вероятно, можете заставить это работать, развернув поток и ожидая таймаута.
Что-то вроде DetectBufferTimeout.java (непроверенный) будет делать красиво.
Я, однако, согласен, что разворачивание этого отдельного потока - это немного взлома. Возможно, OnBufferingUpdateListener
может гарантировать, насколько часто он вызывает onBufferingUpdate()
, независимо от того, произошло ли изменение в ходе буферизации, чтобы мы могли обнаружить, что мы получаем одно и то же значение снова и снова.
Ответ 2
Как ниже (уровень API ≥ 9):
mp.setOnInfoListener(new OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
loadingDialog.setVisibility(View.VISIBLE);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
loadingDialog.setVisibility(View.GONE);
break;
}
return false;
}
});
ПРИМЕЧАНИЕ. В Android существует известная ошибка. При воспроизведении потока HLS он просто не вызывает OnInfoListener или OnBuffering. проверьте эту ссылку Ошибка OnInfoListener
Ответ 3
Хорошо, теперь я чувствую себя немного оправданным. Я проверил приложение Pandora, и он не отображает индикатор буферизации. Когда музыка прерывается для буферизации, она просто сидит там, как будто ничего не произошло, и пользовательский интерфейс выглядит так, будто он все еще играет. Поэтому я пришел к выводу, что если вы используете MediaPlayer, просто невозможно определить, временно ли приостановлена трассировка для буферизации.
Однако я заметил, что есть несколько констант MediaPlayer, которые могут быть полезны: MEDIA_INFO_BUFFERING_START и MEDIA_INFO_BUFFERING_END. Но они доступны только в API уровня 9+, и документы ничего не говорят о них. Я предполагаю, что они могут использоваться с OnInfoListener.
Я разочарован, но, по крайней мере, я могу перестать крутить мои колеса и перейти к чему-то еще.
Ответ 4
Зарегистрируйте OnBufferingUpdate прослушиватель.
Ответ 5
Вы можете использовать поток, который проверяет текущую позицию MediaPlayer. Если позиция не меняется, вы можете заключить, что носитель находится в состоянии буферизации. Вот полный учебник, который я написал: http://www.ottodroid.net/?p=260