Petros Mosoyan
Petros Mosoyan

Reputation: 248

Android MediaPlayer Error (1,-1010)

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

Answers (1)

Petros Mosoyan
Petros Mosoyan

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

Related Questions