VideoView not playing Video from desired position

i am using VideoView and seek bar but when i seekTo(..) on desired position through seekBar it play video from starting.

i trying this code:

 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {

           mVideoView.seekTo(progress);
}

Solution 1:

As Reno mentioned, you have to wait for the seeking to complete.

VideoView does not have a OnSeekCompleteListener() but you can access the MediaPlayer from the onPrepared method of the VideoView and then set the OnSeekCompleteListener, like this :

mVideoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {

        mp.setOnSeekCompleteListener(new OnSeekCompleteListener() {
            @Override
            public void onSeekComplete(MediaPlayer mp) {
                //TODO: Your code here
            }
        });

    }
});

Solution 2:

The call to VideoView.seekTo() is a wrapper around MediaPlayer.seekTo(). This function returns almost immediately even though the actual seeking is still being performed. Therefore you want to wait for seeking to complete via MediaPlayer.OnSeekCompleteListener.

However, as Reno mentioned, the standard VideoView does not support OnSeekCompleteListener.

But you can copy and locally customize the VideoView class to add this support yourself.

First, start with a copy of VideoView.java. Or you can clone the entire frameworks/base repo but warning it is over 1 gig of data to download.

Copy VideoView.java into your Eclipse Android project and it will start building but fail. Here's what I did to get it to compile:

  1. Update the package statement to match your project.
  2. Comment out the references to MetaData. The fix for this is on my todo list. These need to be replaced with calls to MediaMetadataRetriever.
  3. Replace mContext with calls to getBaseContext()

Now you are ready to add the code for OnSeekCompleteListener. The implementation is similar to the other listeners, i.e OnCompletionListener.

public class VideoView extends SurfaceView
        implements MediaPlayerControl {

    // The client's listener which is the notification callback.
    private OnSeekCompleteListener mOnSeekCompleteListener;

    // Set up MediaPlayer to forward notifications to client.
    private MediaPlayer.OnSeekCompleteListener mSeekCompleteListener =
        new MediaPlayer.OnSeekCompleteListener() {
        public void onSeekComplete(MediaPlayer mp) {
            if (mOnCompletionListener != null) {
                mOnCompletionListener.onCompletion(mMediaPlayer);
            }
        }
    };

    // API for client to set their listener.
    public void setOnSeekCompleteListener(OnSeekCompleteListener l)
    {
        mOnSeekCompleteListener = l;
    }
}

Finally, update your own code:

  1. Update references to android.widget.VideoView to use your customized VideoView.
  2. Implement a listener and set it via by calling setOnSeekCompleteListener().

Your code now receives notifications when the seek has really completed and it can then perform subsequent seeks.