Android 媒体播放器错误 (1,-1010) [英] Android MediaPlayer Error (1,-1010)

查看:126
本文介绍了Android 媒体播放器错误 (1,-1010)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从 URL 流式传输音乐.我正在使用 SeekBar 来更改歌曲的位置.尝试将歌曲的位置更改为尚未下载的位置时出现错误.在其他情况下(如果歌曲已完全下载,则代码工作正常.

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.

出现以下错误:E/MediaPlayerNative: 错误 (1, -1010)E/MediaPlayer: 错误 (1,-1010)

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);
        }
    });
}

推荐答案

亲爱的朋友们,问题是我试图跳过尚未下载的位置.在首先寻找该位置之前,我正在检查该部分是否已下载.如果没有,我会等到它被下载,然后再寻找那个位置.代码如下:

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);
            }
        } 
    }
}

这篇关于Android 媒体播放器错误 (1,-1010)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆