13
votes

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);
}
5
@just i have doubt so i want to just know.Is VideoView working in emulator? or you are testing on device?Because i heard that VideoView is not working in emulator?Android Killer
i am trying in both video view playing vedio but problem is seekTo() plz helpHemant Menaria
Could you post more code, so that we can understand the problem.Karthik

5 Answers

26
votes

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
            }
        });

    }
});
5
votes

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.

3
votes

You have to wait for the seeking to complete, unfortunately VideoView does not have a OnSeekCompleteListener() (why Google? -_-)

0
votes

use my method works like charm

    1) Take mediaPlayer
        
        MediaPlayer mediaPlayer;

    2) init mediaPlayer
        
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer = mp; 
            }
        });
                
    3) use seekTo method like this

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mediaPlayer.seekTo((int) mStartPosition, MediaPlayer.SEEK_CLOSEST);
        } else {
            mediaPlayer.seekTo((int) mStartPosition);
        }
-2
votes

You should use

mVideoView.seekTo(progress, SEEK_CLOSEST)