Updated 26 October 2017
What is a SeekBar? Well according to android.developers.com, A SeekBar is an extension of ProgressBar that adds a draggable thumb. The user can touch the thumb and drag left or right to set the current progress level or use the arrow keys. Placing focusable widgets to the left or right of a SeekBar is discouraged. You must have seen a bar with your media player (audio or video). It helps you to navigate to a certain time of the audio or video you are using.
We are going to check that how we can achieve this in Android.
If you are not aware of the media player class then you can follow the below provided links to learn how to play the audios in your android app.
Let us begin with adding seek bar with your media player object.
1 |
public MediaPlayer mMediaPlayer; |
We are gonna assume that you have you already have a Mediaplayer object initialized with your media. Now we will have to set the max value for the seek bar with the duration of the media file
1 |
yourSeekbar.setMax(mMediaPlayer.getDuration()); |
and we need a handler which will constantly update the seek bar according to the media player object with the help of a Runnable. We are using this because only the main thread can update the UI.
1 2 3 4 5 6 7 8 |
private Handler mSeekbarUpdateHandler = new Handler(); private Runnable mUpdateSeekbar = new Runnable() { @Override public void run() { yourSeekbar.setProgress(mMediaPlayer.getCurrentPosition()); mSeekbarUpdateHandler.postDelayed(this, 50); } }; |
the above handler updates the seek after every 50ms. You can change this time according to your requirement.
Now we have to call this handler when the audio starts to play. The below code segment shows how to do this.
1 |
mSeekbarUpdateHandler.postDelayed(mUpdateSeekbar, 0); |
and on pause, you can remove the callback.
1 |
mSeekbarUpdateHandler.removeCallbacks(mUpdateSeekbar); |
The above process connects the seek bar to the media player but it will not seek the media player yet. For this, you will have to set an OnSeekBarChangeListener which will use the MediaPlayer’s seekTo function and seek the media file to a particular time.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
yourSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) mMediaPlayer.seekTo(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }; |
this will seek to the position where ever the seek bar pointer is. The check fromUser is must otherwise it will keep seeking the media player on every second and the media output will come with some disturbance or lag.
That’s all you need to do to get a smoothly working SeekBar.
Thank you very much. This is Vedesh Kumar signing off.
If you have more details or questions, you can reply to the received confirmation email.
Back to Home
30 comments
This code work perfectatly (Work also in kotlin)
is there a solution pleaze thanks 🙂
Will it be possible for you to post your code here? So that we can have a look.
i am getting such error
java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.widget.SeekBar.setProgress(int)’ on a null object reference
at com.example.video69.Activityfiles$1.run(Activityfiles.java:43)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
MediaPlayer mediaPlayer;
AudioManager audioManager;
Handler mSeekbarUpdateHandler;
Runnable mUpdateSeekbar;
public void play(View view){
mediaPlayer.start();
mSeekbarUpdateHandler.postDelayed(mUpdateSeekbar, 0);
}
public void pause(View view){
mediaPlayer.pause();
mSeekbarUpdateHandler.removeCallbacks(mUpdateSeekbar);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mediaPlayer = MediaPlayer.create(this, R.raw.demosong);
SeekBar volumeControl = (SeekBar) findViewById(R.id.volumeSeekBar);
final SeekBar songControl = (SeekBar) findViewById(R.id.songSeekBar);
songControl.setMax(mediaPlayer.getDuration());
volumeControl.setMax(maxVolume);
volumeControl.setProgress(currentVolume);
volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i,0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
songControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
mediaPlayer.seekTo(i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
mSeekbarUpdateHandler = new Handler();
mUpdateSeekbar = new Runnable() {
@Override
public void run() {
songControl.setProgress(mediaPlayer .getCurrentPosition());
mSeekbarUpdateHandler.postDelayed(this, 50);
}
};
}
}