MediaPlayer.seekTo () не работает для небуферизованной позиции - PullRequest
12 голосов
/ 09 июля 2010

Я использую MediaPlayer для воспроизведения одной mp3-песни из сети. Источником данных является HTTP URL.

Предположим, у нас есть следующее игровое состояние.

Продолжительность песни: 1: 00

Текущий прогресс: 0: 10

Текущий прогресс буферизации 0: 30

Допустим, я хочу пропустить какую-то часть песни и искать вперед. Я делаю это с помощью метода MediaPlayer.seekTo (). Если я стремлюсь в буферную позицию (0:20), она выполняется правильно. Но если я стремлюсь к позиции, которая еще не была буферизована (0:40), MediaPlayer ведет себя странно. Это немедленно указывает на то, что он искал правильно, не дожидаясь заполнения буфера. Фактически, он продолжает играть в той же позиции, в которой находился до поиска. Отныне метод MediaPlayer.getCurrentPosition () возвращает неправильную позицию. Когда воспроизведение подходит к концу и вызывается обратный вызов OnCompletionListener.onCompletion, текущая позиция медиаплеера значительно превышает длительность всей песни.

Есть идеи для решения этой проблемы?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2010

Я нашел обходной путь для этой проблемы:

Сначала вы создаете OnBufferingUpdateListener:

MediaPlayer.OnBufferingUpdateListener bufferingListener = new MediaPlayer.OnBufferingUpdateListener() {
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        //code to increase your secondary seekbar
    }
};

Затем в событии панели поиска onProgressChanged выполните следующее:

public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
    int secondaryPosition = seekBar.getSecondaryProgress();
    if (progress > secondaryPosition)
        seekBar.setProgress(secondaryPosition);
}

При этом вы гарантируете, что пользователь не сможет перетащить индикатор выполнения в небуферизованную позицию (а также вы увидите, что буферизовано).

3 голосов
/ 18 августа 2010

Это было исправлено в Android 2.2 на некоторых устройствах только, насколько я знаю.

Однако Android 2.2 не справляется с поиском буферизованных позиций. Хотя позиция уже буферизована, MediaPlayer отправляет запрос на сервер.

1 голос
/ 09 июля 2010

Вероятно, это связано с ошибкой, которая (ссылается на один из комментариев) в конечном итоге исправлена ​​в 2.2 http://code.google.com/p/android/issues/detail?id=4124

...