Natarajan Raman
Natarajan Raman

Reputation: 606

Android MediaPlayer SeekTo function workaround

I am creating a very simple media player app. I would like to resume the song from the SeekTo position that I have captured using getCurrentPosition. However seekTo does not start from the position I have captured but from the beginning.

Code to capture current position, pause and change button text to Click to resume

int media_length = mediaplayer.getCurrentPosition();
    Toast.makeText(this,"media length is"+media_length, Toast.LENGTH_LONG).show();
    mbutton.setText("Click to Resume");
    mediaplayer.pause();

Code to seekTo captured position, start and change button text to Click to Pause

    mediaplayer.seekTo(media_length);
    mediaplayer.start();
    mbutton.setText("Click to Pause");

A couple of posts are there already related to it but they seem to claim a bug in Android. Ref: MediaPlayer seekTo doesn't work and is there any workaround for this? appreciate any help.

Upvotes: 9

Views: 20963

Answers (3)

Developer Reyaz
Developer Reyaz

Reputation: 41

Try this , it works

   videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
            mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
                @Override
                public void onSeekComplete(MediaPlayer mp) {
                    mp.start();
                }
            });

        }
    });

Upvotes: 0

Dany Pop
Dany Pop

Reputation: 3648

Try to use the callback MediaPlayer.OnSeekCompleteListener.

Important : In this sample, i've added SystemClock.sleep(200) because onSeekComplete(MediaPlayer arg0) is called too soon by the player BEFORE seekTo is really completed.

 mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(MediaPlayer arg0) {
            Log.d(TAG, "onSeekComplete() current pos : " + arg0.getCurrentPosition());
            SystemClock.sleep(200);
            mMediaPlayer.start();
        }
    });
    try {
        mMediaPlayer.seekTo(mCurrentPos);
    } catch (IllegalStateException e){
        Log.d(TAG, e.getLocalizedMessage(), e);
    }

Upvotes: 1

Sanket
Sanket

Reputation: 3134

You can try below code. It is working for me...

public void forwardSong() {
    if (mPlayer != null) {
        int currentPosition = mPlayer.getCurrentPosition();
        if (currentPosition + seekForwardTime <= mPlayer.getDuration()) {
            mPlayer.seekTo(currentPosition + seekForwardTime);
        } else {
            mPlayer.seekTo(mPlayer.getDuration());
        }
    }
}

You can pause mediaplayer before this and just call start method after this method.

Upvotes: 14

Related Questions