Android MediaPlayer - положение перемещается во время буферизации

Я испытываю странное поведение при потоковой передаче музыки на некоторых устройствах. Когда звук сначала начинает воспроизводиться, положение перескакивает и играет беспорядочно до тех пор, пока буферизация не будет полностью завершена.

Я начал с пример кода из Tutorials Point. Я создаю MediaPlayer в OnCreate() как таковой:

// Create Media Player
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
prepareMediaPlayer();

prepareMediaPlayer устанавливает такие данные следующим образом:

private void prepareMediaPlayer() {

    try {
        mediaPlayer.setDataSource(myurl);
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                Toast.makeText(getApplicationContext(), 
                        "Playing sound",Toast.LENGTH_SHORT).show();

                mediaPlayer.start();

            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

и onBufferingUpdate печатает ход буфера:

@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int bufferingProgress) {
    Log.v(TAG, "onBufferingUpdate() "+bufferingProgress + 
            "\ncurrentposition: "+mediaPlayer.getCurrentPosition());

    seekbar.setSecondaryProgress(bufferingProgress);
}

И вывод журнала, который я получаю, показывает, как позиция перескакивает, пока медиаплеер все еще буферизует. Я тестировал несколько устройств, и это происходит только на Moto G. Это ошибка в прошивке или я что-то не так?

08-29 12:50:17.934 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 4
                                                                              currentposition: 0
08-29 12:50:17.934 277/com.test.mediaplayer D/MediaPlayer: setSubtitleAnchor in MediaPlayer
08-29 12:50:17.976 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 4
                                                                              currentposition: 0
08-29 12:50:18.014 27927-27945/com.test.mediaplayer V/RenderScript: 0xb7912ee8 Launching thread(s), CPUs 4
08-29 12:50:21.414 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 8
                                                                              currentposition: 7
08-29 12:50:34.930 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 11
                                                                              currentposition: 9
08-29 12:50:50.085 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 15
                                                                              currentposition: 4
08-29 12:51:32.991 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 19
                                                                              currentposition: 2
08-29 12:53:25.036 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 22
                                                                              currentposition: 5
08-29 12:53:51.976 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 26
                                                                              currentposition: 1
08-29 12:56:26.004 27927-27946/com.test.mediaplayer I/MediaHTTPConnection: proxyName: 0.0.0.0 0
08-29 12:56:34.651 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 30
                                                                              currentposition: 10
08-29 12:56:35.862 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 33
                                                                              currentposition: 1102
08-29 12:56:38.211 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 37
                                                                              currentposition: 4
08-29 12:56:40.097 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 41
                                                                              currentposition: 9
08-29 12:56:43.034 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 44
                                                                              currentposition: 9
08-29 12:56:45.130 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 48
                                                                              currentposition: 3
08-29 12:56:49.841 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 52
                                                                              currentposition: 8
08-29 12:56:52.500 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 55
                                                                              currentposition: 8
08-29 12:56:55.748 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 63
                                                                              currentposition: 7
08-29 12:56:57.080 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 74
                                                                              currentposition: 1223
08-29 12:56:59.072 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 81
                                                                              currentposition: 979
08-29 12:57:00.073 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 81
                                                                              currentposition: 1979
08-29 12:57:03.596 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 88
                                                                              currentposition: 5
08-29 12:57:05.862 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 92
                                                                              currentposition: 4
08-29 12:57:08.291 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 95
                                                                              currentposition: 8
08-29 12:57:13.903 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 99
                                                                              currentposition: 9
08-29 12:57:14.904 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 100
                                                                              currentposition: 668
08-29 12:57:34.261 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 100
                                                                              currentposition: 224068

Ответ 1

В документе docs есть примечание:

Существует тонкое, но важное различие между недавно созданным объектом MediaPlayer и объектом MediaPlayer после вызова reset(). Это ошибка программирования для вызова методов, таких как getCurrentPosition()... в состоянии ожидания для обоих случаев

Он также добавляет:

Важно отметить, что состояние подготовки является переходным состоянием, а поведение вызова любого метода с побочным эффектом, когда объект MediaPlayer находится в состоянии подготовки, - undefined.

Кажется, вам небезопасно называть getCurrentPosition() до после onPrepared обратного вызова. Возможно, решение состоит в приостановке воспроизведения при буферизации.