Pause and search in Android MediaPlayer

I have SeekBarand a MediaPlayer. I want to search while it stops, but it seems that the documents are lying to me:

Note that seekTo (int) can also be called in other states, such as a ready, pause, and play state.

As usual, on Android I have to write workarounds instead of code (and in what state MediaPlayerat this time I cannot know, therefore this table and the state machine are absolutely useless). Because instead onSeekComplete onCompletion(more than 9000 times, I'm not joking) the method is called! onSeekCompleteIt is called only after a call seekTofrom onPrepared(WHY, GOD, WHY ???). I don’t even know what to do. I spent about 5 hours on this and nothing is fixed. What can I do?

UPD

Here is my code.

private void setupMediaPlayer() {
    savedMediaPlayerState = null;

    mediaPlayer = application.getMediaPlayer();

    String mp3Path = "/path/to/mp3";

    mediaPlayer.setOnCompletionListener(this);
    mediaPlayer.setOnSeekCompleteListener(this);
    mediaPlayer.setOnErrorListener(this);

    mediaPlayer.setDataSource(mp3Path);
    mediaPlayer.prepare();
}

@Override
public void onProgressChanged(android.widget.SeekBar sb, int i, boolean b) {
    Log.i(TAG, String.format("Progress changed! %d", i));
    if (b) {
        mediaPlayer.seekTo(i);
        updateProgressBarAndDurationLabels(i, mediaPlayer.getDuration(), false);
    }
}

@Override
public void onStartTrackingTouch(android.widget.SeekBar sb) {
    handler.removeCallbacks(updateTimeTask);
    mediaPlayer.pause();
}

@Override
public void onStopTrackingTouch(android.widget.SeekBar sb) {
    int totalDuration = mediaPlayer.getDuration();
    int currentPosition = sb.getProgress();// * totalDuration / 100;

    mediaPlayer.seekTo(currentPosition);
    mediaPlayer.start();

    updateProgressBar();

    isSeeking = false;
}

@Override
public void onCompletion(MediaPlayer mediaPlayer) {
    if (!isSeeking) {
        Log.i(TAG, "completed"); // Called over 9000 times
        audioStopped();
    }
}

@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i2) {
    return false;    // Error -38 lol
}

@Override
public void onSeekComplete(MediaPlayer mp) {
    Log.i(TAG, String.format("seek to: %d", mp.getCurrentPosition()));
    isSeeking = false;
}
+5
1

onErrorListener , what=-38. true onError . , .

+7

All Articles