how to get seekbar to automatically move on song play?
First of all you should define a Runnable
object that will be triggered each second. For your situation, in everysecond that class will be triggered.
I will paste some example code. Here is the runnable class.
Runnable timerRunnable = new Runnable() {
public void run() {
// Get mediaplayer time and set the value
// This will trigger itself every one second.
updateHandler.postDelayed(this, 1000);
}
};
And you should also have a Handler
that will trigger Runnable
instance.
Handler updateHandler = new Handler();
updateHandler.postDelayed(timerRunnable, 1000);
I hope that sample will help you.
Related videos on Youtube
user3439273
Updated on June 04, 2022Comments
-
user3439273 almost 2 years
I have looked everywhere to fix my problem but i just cant seem to get it going.
How do i make seekbar automatically slide with song play ?
this is what i have so far.
ArrayList<String> arrlist = new ArrayList<String>(20); private Handler seekHandler = new Handler(); ImageButton next, playPause, previous; SeekBar seekBar; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); getSupportActionBar().hide(); getInit(); } public void getInit() { songCurrentDurationLabel = (TextView) findViewById(R.id.startTime); songTotalDurationLabel = (TextView) findViewById(R.id.endTime); mediaPlayer = new MediaPlayer(); mediaPlayer = MediaPlayer.create(this, R.raw.firstsong); seekBar = (SeekBar) findViewById(R.id.seekBar1); seekBar.setMax(mediaPlayer.getDuration()); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // remove message Handler from updating progress bar seekHandler.removeCallbacks(mUpdateTimeTask); int totalDuration = mediaPlayer.getDuration(); int currentPosition = progressToTimer(seekBar.getProgress(), totalDuration); // forward or backward to certain seconds mediaPlayer.seekTo(currentPosition); // update timer progress again updateProgressBar(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // remove message Handler from updating progress bar seekHandler.removeCallbacks(mUpdateTimeTask); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (mediaPlayer != null && fromUser) { mediaPlayer.seekTo(progress); // mediaPlayer.seekTo(progress * 1000); } } }); spinner = ((Spinner) findViewById(R.id.spinner1)); spinner.setAdapter(songAdapter); previous = ((ImageButton) findViewById(R.id.previous)); playPause = ((ImageButton) findViewById(R.id.play)); next = ((ImageButton) findViewById(R.id.next)); spinner.setOnItemSelectedListener(this); previous.setOnClickListener(this); playPause.setOnClickListener(this); next.setOnClickListener(this); totalDuration = mediaPlayer.getDuration(); currentDuration = mediaPlayer.getCurrentPosition() / 1000; // Displaying Total Duration time songTotalDurationLabel.setText("" + milliSecondsToTimer(totalDuration)); // Displaying time completed playing songCurrentDurationLabel.setText("" + milliSecondsToTimer(currentDuration)); } public void updateProgressBar() { seekHandler.postDelayed(mUpdateTimeTask, 100); } private Runnable mUpdateTimeTask = new Runnable() { @Override public void run() { long totalDuration = mediaPlayer.getDuration(); long currentDuration = mediaPlayer.getCurrentPosition() / 1000; int progress = (int) getProgressPercentage(currentDuration, totalDuration); // Updating progress bar seekBar.setProgress(progress); // Running this thread after 100 milliseconds seekHandler.postDelayed(this, 100); } }; public int progressToTimer(int progress, int totalDuration) { int currentDuration = 0; totalDuration = (int) (totalDuration / 1000); currentDuration = (int) ((((double) progress) / 100) * totalDuration); // return current duration in milliseconds return currentDuration * 1000; } public int getProgressPercentage(long currentDuration1, long totalDuration1) { Double percentage = (double) 0; long currentSeconds = (int) (currentDuration1 / 1000); long totalSeconds = (int) (totalDuration1 / 1000); // calculating percentage percentage = (((double) currentSeconds) / totalSeconds) * 100; // return percentage return percentage.intValue(); } public String milliSecondsToTimer(long milliseconds) { String finalTimerString = ""; String secondsString = ""; // Convert total duration into time int hours = (int) (milliseconds / (1000 * 60 * 60)); int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60); int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000); // Add hours if there if (hours > 0) { finalTimerString = hours + ":"; } // Prepending 0 to seconds if it is one digit if (seconds < 10) { secondsString = "0" + seconds; } else { secondsString = "" + seconds; } finalTimerString = finalTimerString + minutes + ":" + secondsString; // return timer string return finalTimerString; } }
I didnt include the song list and all the other stuff as i dont see why it would be necesary to put here. But anyways, when i do what i have here i dont get no error or anything, the seekbar just doesnt automatically move and when i try to move it manually to a position it goes right back to 0.
-
user1172579 about 9 yearswhere do i put the runnable and handler ?