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();
}
}
}
}
...
...
}
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()){}
}
};