0

Hello i want to update seekbar smoothly which update on every second, so i have created a method using timer which update seekbar on every second but its updating the song again nd again on every second i have searched on everywhere but not getting solution i don't want to use any handler i want to fix using this method

 private  void updateseekbar() {


    seekBar.setMax(mediaPlayer.getDuration());

     new Timer().schedule(new TimerTask() {
       @Override
       public void run() {

                   seekBar.setProgress(mediaPlayer.getCurrentPosition());

       }
   },1000,1000);

and here i have implemente the method when song start

  public void play(View v) {

    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        updateseekbar();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);
    } else if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
        imageview.setImageResource(R.drawable.img_btn_pause);
    } else if (mediaPlayer != null) {
        mediaPlayer.start();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);



    }

here is my full code

private SeekBar seekBar;
TextView startduration,totalduration;
ImageView imageview, forwardd, backword, next, previous;
ArrayList<Integer> songlist = new ArrayList<>();
MediaPlayer mediaPlayer;
int seektime = 5000;
int index = 0;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    seekBar = (SeekBar) findViewById(R.id.seekBar);
    imageview = (ImageView) findViewById(R.id.imageview);
    forwardd = (ImageView) findViewById(R.id.forwardd);
    backword = (ImageView) findViewById(R.id.backword);
    next = (ImageView) findViewById(R.id.next);
    previous = (ImageView) findViewById(R.id.previous);
    startduration= (TextView) findViewById(R.id.startduration);
    totalduration= (TextView) findViewById(R.id.totalduration);


    songlist.add(R.raw.diljaniya);
    songlist.add(R.raw.stand);
    songlist.add(R.raw.haledil);
    songlist.add(R.raw.myname);
    songlist.add(R.raw.fiftyways);
    songlist.add(R.raw.desiboys);

    previous = (ImageView) findViewById(R.id.previous);

 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
     @Override
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

         seekBar.setMax(mediaPlayer.getDuration());
         mediaPlayer.seekTo(i);


     }

     @Override
     public void onStartTrackingTouch(SeekBar seekBar) {

     }

     @Override
     public void onStopTrackingTouch(SeekBar seekBar) {

     }
 });

    forwardd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (mediaPlayer != null) {
                int med = mediaPlayer.getCurrentPosition();
                if (med <= mediaPlayer.getDuration()) {
                    mediaPlayer.seekTo(med + seektime);
                    seekBar.setProgress(med+seektime);


                }
            } else {

            }
        }
    });
    backword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (mediaPlayer != null) {
                int med = mediaPlayer.getCurrentPosition();
                if (med - seektime >= 0) {
                    mediaPlayer.seekTo(med - seektime);
                    seekBar.setProgress(med-seektime);
                } else {
                }
            } else {
            }
        }
    });
}

public void play(View v) {

    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        updateseekbar();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);
    } else if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
        imageview.setImageResource(R.drawable.img_btn_pause);
    } else if (mediaPlayer != null) {
        mediaPlayer.start();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);



    }

}

public void previouss(View v) {
    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.reset();
    }

    if (index < songlist.size() - 1) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        seekBar.setProgress(0);
    } else {
        index = 0;
        return;
    }
    index++;
}

public void next(View v) {

    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.reset();
    }
    if (index < songlist.size()) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        seekBar.setProgress(0);
    } else {
        index = 0;
        return;
    }
    index++;
}


private  void updateseekbar() {


    seekBar.setMax(mediaPlayer.getDuration());

     new Timer().schedule(new TimerTask() {
       @Override
       public void run() {

                   seekBar.setProgress(mediaPlayer.getCurrentPosition());

       }
   },1000,1000);

}








}
  • Possible duplicate of [SeekBar and media player in android](https://stackoverflow.com/questions/17168215/seekbar-and-media-player-in-android) – Amit Vaghela Oct 17 '17 at 06:18
  • i have updated the question with full code – Bakhtiyar Hussain Oct 17 '17 at 06:25
  • no its not duplicate – Bakhtiyar Hussain Oct 17 '17 at 06:25
  • `"but its updating the song again nd again on every second"`, what does it mean? – pskink Oct 17 '17 at 06:30
  • it mean its updating the music on everysecond like looping – Bakhtiyar Hussain Oct 17 '17 at 06:33
  • i have no idea what you are talking about, sorry, `"updating the music"` how updating? – pskink Oct 17 '17 at 06:34
  • just guide me how to update the seekbar when music plays my problem will be solved using timer only – Bakhtiyar Hussain Oct 17 '17 at 06:37
  • simply use `setProgress` method in one second interval – pskink Oct 17 '17 at 06:39
  • see log cat 10-17 11:39:43.271 5266-5266/abc.myapp.input.mediaseekbar V/MediaPlayer-JNI: getCurrentPosition: 5907 (msec) 10-17 11:39:43.271 5266-5277/abc.myapp.input.mediaseekbar V/MediaPlayer: message received msg=6, ext1=0, ext2=0 10-17 11:39:43.281 5266-5277/abc.myapp.input.mediaseekbar V/MediaPlayer: Received MEDIA_STARTED 10-17 11:39:43.281 5266-5277/abc.myapp.input.mediaseekbar V/MediaPlayer: callback application V/MediaPlayer: back from callback 10-17 11:39:43.281 5266-5266/abc.myapp.input.mediaseekbar V/MediaPlayer-JNI: getCurrentPosition: 5042 (msec) – Bakhtiyar Hussain Oct 17 '17 at 06:41
  • i have just removed media.seekto(i) from public void onProgressChanged(SeekBar seekBar, int i, boolean b) then its working fine but then how to update progress change when user drag seekbar – Bakhtiyar Hussain Oct 17 '17 at 07:02

1 Answers1

1

Declare Timer as global member variables like this;

Timer timer=new Timer();

Update the song inside updateseekbar method like this

  private void updateseekbar(Boolean songPlay) {
    if(songPlay){
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                seekBar.setProgress(mediaPlayer.getCurrentPosition());

            }
        },1000,1000);
        handler.postDelayed(runnable,0);
    }else {
        timer.cancel();
        timer.purge();
    }
}

Update seekBar while play the song like this

updateseekbar(true);

Stop the seekBar update like this

updateseekbar(false);
Sharath kumar
  • 4,064
  • 1
  • 14
  • 20