Reputation: 248
I'm trying to stream music from URL. I'm using SeekBar to change the position of the song. I'm getting an error when trying to change position of the song to position which is not downloaded yet. In other case (if the song full downloaded the code works fine.
Getting the following error: E/MediaPlayerNative: error (1, -1010) E/MediaPlayer: Error (1,-1010)
Can you please advise how to resolve the issue. Here is the code:
mSeekBar = findViewById(R.id.seekBar);
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
}
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.reset();
}
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
return false;
}
});
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
}
});
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 * 1000);
seekBar.setProgress(progress);
}
}
});
playAudio(url);
}
private void playAudio(String url) {
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(url);
mMediaPlayer.prepare();
mSeekBar.setMax(mMediaPlayer.getDuration() / 1000);
getAudioInfo();
} catch (IOException e) {
e.printStackTrace();
}
}
private void getAudioInfo() {
PlayMusicActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mSeekBar.setProgress(mCurrentPosition);
}
mHandler.postDelayed(this, 1000);
}
});
}
Upvotes: 2
Views: 6602
Reputation: 248
Dear Friends the problem was that I try to skip position which is not downloaded yet. Before to seek to that position at first I'm checking if that part is downloaded or not. If not I'm waiting until it will be downloaded and after that seeking to that position. Here is the code:
private Handler mHandlerDownloadUpdate = new Handler();
public static MediaPlayer mMediaPlayer;
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
} else {
mMediaPlayer.release();
mMediaPlayer = new MediaPlayer();
}
mMediaPlayer.setOnBufferingUpdateListener(bufferingUpdateListener);
mSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
private void initRunnable(final int progress) {
mRunnable = new Runnable() {
@Override
public void run() {
if (progress * 100 / mDuration < mPercentOfDownload) {
mMediaPlayer.seekTo(progress * 1000);
mMediaPlayer.start();
return;
}
mHandlerDownloadUpdate.postDelayed(this, 1000);
}
};
MediaPlayer.OnBufferingUpdateListener bufferingUpdateListener = new
MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
mPercentOfDownload = percent;
if (mDuration != 0) {
int second = percent * mDuration / 100;
mSeekBar.setSecondaryProgress(second);
}
}
SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, final int progress,
boolean fromUser) {
if (mMediaPlayer != null && fromUser) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
seekBar.setProgress(progress);
int a = (progress * 100 / mDuration);
if (a < mPercentOfDownload) {
mMediaPlayer.seekTo(progress * 1000);
mMediaPlayer.start();
} else {
mHandlerDownloadUpdate.removeCallbacks(mRunnable);
initRunnable(progress);
PlayMusicActivity.this.runOnUiThread(mRunnable);
}
}
}
}
Upvotes: 1