Search code examples
javaandroidrunnableseekbar

How to not have seekBar set to 0 when next song is played


I would like to have the mediaplayer play the next song, and have the seekbar continuously go forward. However, right now the seekbar resets back to 0 when the next song is played.

How would I have the seekBar not reset back to 0 when the next song is played?

Here is my onCompletion method:

@Override
public void onCompletion(MediaPlayer mediaPlayer) {
  mp.release();
  if(currentTrack < tracks.length) {
    currentTrack++;
    if (currentTrack >= 2) {
      currentTrack = 0;
    }
    mp = MediaPlayer.create(this, tracks[currentTrack]);
    mp.setOnCompletionListener(this);
    if (currentTrack > 0) {
      mp.seekTo(tracks[currentTrack]);
    }
    handler.post(UpdateSongTime);
    mp.start();
  }
}

Here is the thread that updates all of the positioning:

private Runnable UpdateSongTime = new Runnable() {
  @Override
  public void run() {
    if(mp.isPlaying()) {
      startTime = mp.getCurrentPosition() / 1000;
      seekBar.setMax(songEndTime);
      int currentSongEndTime = songEndTime - mp.getCurrentPosition()/1000;
      startTimeText.setText(convertSeekLength(startTime));
      String endTime = "-" + convertSeekLength(currentSongEndTime);
      songDisplay.setText(songArrayList.get(currentTrack).getTitle());
      endTimeText.setText(endTime);
      seekBar.setProgress(startTime);
      handler.postDelayed(this, 100);
    }
  }
};

Solution

  • Just created a solution myself that involves creating an Arraylist of mediaPlayers instead of just making one mediaPlayer.

    Here is the working code if anyone needs it:

    public void onCompletion(MediaPlayer mediaPlayer) {
      for(int i = 0; i < currentTrack; i++) {
        trueSeek += mediaPlayers.get(i).getCurrentPosition();
      }
      currentTrack++;
      if(currentTrack >= mediaPlayers.size()){
        currentTrack = 0;
      }
      handler.post(UpdateSongTime);
      mediaPlayers.get(currentTrack).start();
    }
    

    and the thread:

    private Runnable UpdateSongTime = new Runnable() {
      @Override
      public void run() {
        if(currentTrack == 0){
          trueSeek = mediaPlayers.get(currentTrack).getCurrentPosition();
          startTime = trueSeek;
        }
        if(currentTrack > 0){
          int tempSeek = 0;
          for(int i = 0; i < currentTrack; i++){
            tempSeek += mediaPlayers.get(i).getCurrentPosition();
          }
          trueSeek = mediaPlayers.get(currentTrack).getCurrentPosition() + tempSeek;
          startTime = trueSeek;
        }
        seekBar.setMax(songEndTime);
        int currentSongEndTime = songEndTime - trueSeek;
        startTimeText.setText(convertSeekLength(startTime));
        String endTime = "-" + convertSeekLength(currentSongEndTime);
        songDisplay.setText(songArrayList.get(currentTrack).getTitle());
        endTimeText.setText(endTime);
        seekBar.setProgress(startTime);
        handler.postDelayed(this, 100);
      }
    };