how to get seekbar to automatically move on song play?

10,481

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.

Share:
10,481

Related videos on Youtube

user3439273
Author by

user3439273

Updated on June 04, 2022

Comments

  • user3439273
    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
    user1172579 about 9 years
    where do i put the runnable and handler ?