Search code examples
javaandroidmediaseekbar

Android Media Player SeekBar not seeking through songfile


I have some trouble getting the Seekbar to work, The first song that loads will not let me use the SeekBar, but when I load a secondary or third song the SeekBar will work for them. I tried initializing the SeekBar after the song Uri dataSource was loaded, however it still exhibited the same behavior.

Any ideas on how to get the SeekBar to work on the first song?

Thanks

...

public class MainActivity extends AppCompatActivity {

    final int REQUEST_OPEN_FILE = 1;
    MediaPlayer mediaPlayer = new MediaPlayer();
    Uri audioFileUri;
    /*SeekBar seekBar;*/
    /*TextView SongProgress = findViewById(R.id.SongProgress);*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
    }

    ...

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_OPEN_FILE) {
            if (resultCode == RESULT_OK) {
                audioFileUri = data.getData();
                SeekBar seekBar;
                seekBar = findViewById(R.id.seekbar);
                seekBar.setMax(mediaPlayer.getDuration());
                seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                        seekBar.setProgress(progress);
                        mediaPlayer.seekTo(progress);
                        /*int Minutes=((progress/1000)/60);
                        int Seconds=((progress/1000)%60);
                        int time = Minutes + Seconds;
                        SongProgress.setText(time);*/
                    }


                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {

                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {

                    }
                });

                    try {
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.reset();
                            mediaPlayer.setDataSource(this, audioFileUri);
                            mediaPlayer.prepare();
                            mediaPlayer.start();
                            Toast.makeText(this, "Was Playing", Toast.LENGTH_SHORT);

                        }
                        else{
                            mediaPlayer.setDataSource(this, audioFileUri);
                            mediaPlayer.prepare();
                            mediaPlayer.start();
                            Toast.makeText(this, "Was not playing", Toast.LENGTH_SHORT);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    ...

    ...
}

Solution

  • Ok, I got the seekbar progress to update with the song so that the seekbar tracks along the audio file while it is playing. It was a simple runnable with a handler which I've posted in the code here. You have to have a runnable loop to track through the song as it is playing to update the seekbar. Then you have to write a handler to call that runnable loop. One important thing to note if you don't add the Boolean if(fromUser) in the seekbar onchanged listener the thread will cause it to play back choppy because it is also updating the progress in relation to the seekBar update progress function.

        SeekBar seekBar;
        Handler handler = new Handler();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
    
            seekBar = (SeekBar) findViewById(R.id.seekbar);
    
            ...
        }
    
        ...
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            if (requestCode == REQUEST_OPEN_FILE) {
                if (resultCode == RESULT_OK) {
                    audioFileUri = data.getData();
                    try {
    
                        if (mediaPlayer.isPlaying()) {
                            seekBar.setProgress(0);
                            mediaPlayer.reset();
                            mediaPlayer.setDataSource(this, audioFileUri);
                            mediaPlayer.prepare();
                            mediaPlayer.start();
                            seekBar.setMax(mediaPlayer.getDuration()); // Set the Maximum range of the
                            Toast.makeText(this, "Was Playing", Toast.LENGTH_SHORT);
                        } else {
                            seekBar.setProgress(0);
                            mediaPlayer.setDataSource(this, audioFileUri);
                            mediaPlayer.prepare();
                            mediaPlayer.start();
                            seekBar.setMax(mediaPlayer.getDuration()); // Set the Maximum range of the
                            /*seekBar.getVisibility();
                            seekBar.setVisibility(View.INVISIBLE);*/
                            Toast.makeText(this, "Was not playing", Toast.LENGTH_SHORT);
                        }
    
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    int mediaPos = mediaPlayer.getCurrentPosition();
                    int mediaMax = mediaPlayer.getDuration();
                    seekBar.setMax(mediaMax); // Set the Maximum range of the
                    seekBar.setProgress(mediaPos);// set current progress to song's
    
                    handler.removeCallbacks(moveSeekBarThread);
                    handler.postDelayed(moveSeekBarThread, 1000);
                }
    
            }
    
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if(fromUser) {
                        seekBar.setProgress(progress);
                        mediaPlayer.seekTo(progress);
                    }
                    else{}
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
    
                }
            });
        }
    
    
    private Runnable moveSeekBarThread = new Runnable() {
        public void run() {
            if(mediaPlayer.isPlaying()){
                int mediaPos_new = mediaPlayer.getCurrentPosition();
                int mediaMax_new = mediaPlayer.getDuration();
                seekBar.setMax(mediaMax_new);
                seekBar.setProgress(mediaPos_new);
                handler.postDelayed(this, 100); //Looping the thread after 0.1 second
                // seconds
            }else if(mediaPlayer.getCurrentPosition() == mediaPlayer.getDuration()){}
        }
    };