I try to update seekBar when playing, I take the melodies from the array, everything is played and works correctly, I cannot update the seekBar, that is, when the bar is moved, the melody is repeated again and the sekbar does not move. I call in:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootViewB = inflater.inflate(R.layout.fragment2, container, false); seekBar = (SeekBar)rootViewB.findViewById(R.id.sbar); View rootView = inflater.inflate(R.layout.fragment, container, false); startMediaPlayer(); setSeekBar(); public void startMediaPlayer(){ mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } }); ///////////// mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { seekBar.setMax(mp.getDuration()); seekBar.setSecondaryProgress(mp.getDuration() / 100*percent); seekBar.setProgress(mp.getCurrentPosition()); * } }); } 

    3 answers 3

    startPlayProgressUpdater() In the onCreateView body, you call before seekBar , that is, until seekBar = (SeekBar)rootViewB.findViewById(R.id.sbar);

    Hang a listener on your seikbar to update it.

     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(mMediaPlayer != null){ mMediaPlayer.seekTo(progress * 1000); } } }); 

    In initView() setOnTouchListener can be removed completely. And in startPlayProgressUpdater() correct seekBar.setProgress(mediaPlayer.getCurrentPosition() / 1000);

    • corrected in the cap, however, the seakbar is not updated .. although it should - upward

    In general, I do not know how correct it is from the point of view of programming, everything works:

      private Runnable onEverySecond=new Runnable() { @Override public void run() { if(seekBar != null) { seekBar.setProgress(mediaPlayer.getCurrentPosition()); } if(mediaPlayer.isPlaying()) { seekBar.postDelayed(onEverySecond, 1000); } } }; public void startMediaPlayer(){ mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { seekBar.setMax(mp.getDuration()); seekBar.postDelayed(onEverySecond, 1000); mediaPlayer.start(); } }); } public void setSeekBar(){ seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBars, int progress, boolean fromUser) { if(mediaPlayer != null && fromUser){ mediaPlayer.seekTo(progress); } } }); } 

      The general algorithm is as follows: When starting playback, we get and set the length of the track in the SeekBar

       mSeekBar.setMax(mMediaPlayer.getDuration()) 

      then we start the update SeekBar every second

       private Handler mHandler = new Handler(); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { if(mMediaPlayer != null){ int mCurrentPosition = mMediaPlayer.getCurrentPosition(); mSeekBar.setProgress(mCurrentPosition); } mHandler.postDelayed(this, 1000); } }); 

      Do not forget to clear the handler when you stop and restart when you start playing the file.
      After that, install the listener on the SeekBar to rewind the MediaPlayer.

       mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(mMediaPlayer != null && fromUser){ mMediaPlayer.seekTo(progress); } } }); 
      • Corrected the code in the header, but the seekbar is not updated. And you can read more about it: Do not forget to clear the handler when you stop and restart when the file starts to play. - upward