如何在Android中实现MediaPlayer错误重启?

如何在Android中实现MediaPlayer错误重启?,android,android-mediaplayer,Android,Android Mediaplayer,我正在尝试在Android中重新启动MediaPlayer,当出现错误时(与服务器的连接丢失、无法访问网络等)。 我看过很多代码示例,但都有些不标准。我认为必须有标准的方法来重新启动对应的developer.android.com,但现在还不清楚如何设置侦听器,在出现此类错误时重新启动播放器 以下是我的代码部分: public class PlayerService extends Service implements OnErrorListener { .... ///////////////

我正在尝试在Android中重新启动MediaPlayer,当出现错误时(与服务器的连接丢失、无法访问网络等)。 我看过很多代码示例,但都有些不标准。我认为必须有标准的方法来重新启动对应的developer.android.com,但现在还不清楚如何设置侦听器,在出现此类错误时重新启动播放器

以下是我的代码部分:

public class PlayerService extends Service implements OnErrorListener {
....
////////////////////

this.mplayer = MediaPlayer.create(c, Uri.parse(url));
mplayer.setOnErrorListener(onErrorListener);
////////////////////

MediaPlayer.OnErrorListener onErrorListener = new MediaPlayer.OnErrorListener()   
    {  
         @Override  
         public boolean onError(MediaPlayer mp, int what, int extra)   
         {  
              Log.e(getPackageName(), String.format("Error(%s%s)", what, extra));
              playlist="ERROR";

              restart();
              return true;  
         }  
    }; 

@Override
    public boolean onError(MediaPlayer player, int what, int extra) {
        restart();
        return true;
    };

public void restart()
    {
        try
        {
        playlist="RELOADING";
        for (int u=1; u<=5; u++)
        {
        Thread.sleep(5000);
        mplayer.stop();
        mplayer.release();
        mplayer=null;
    playSong(getApplicationContext(),currenturl);
        };

        }
        catch (Exception e)
        {
        playlist="RELOADING ERROR";

        }



    }
//////////////
....

}
公共类PlayerService扩展服务实现OnErrorListener{
....
////////////////////
this.mplayer=MediaPlayer.create(c,Uri.parse(url));
mplayer.setOneRorListener(OneRorListener);
////////////////////
MediaPlayer.OnErrorListener OnErrorListener=新的MediaPlayer.OnErrorListener()
{  
@凌驾
公共布尔onError(MediaPlayer mp,int what,int extra)
{  
Log.e(getPackageName(),String.format(“错误(%s%s)”,what,extra));
playlist=“ERROR”;
重启();
返回true;
}  
}; 
@凌驾
公共布尔onError(MediaPlayer播放器,int what,int extra){
重启();
返回true;
};
公共无效重新启动()
{
尝试
{
playlist=“重新加载”;
对于(int u=1;u概览
我遇到了类似的问题,根据文档,您只需重置媒体播放器即可:

为了重用处于错误状态的MediaPlayer对象并从错误中恢复,可以调用reset()将对象恢复到空闲状态

您当前正在做的是停止和释放(
mplayer.stop()
mplayer.release()
)处于错误状态的媒体播放器。这可能会导致引发类似IllegalStateException的事件。如果它没有引发错误,您仍将尝试在null对象中启动歌曲。您应该使用
mplayer.reset()
函数,而不是调用stop和release,然后将变量设置为null

另一个选项是启动一个新的媒体播放器,但详细说明了新实例化的媒体播放器对象与调用了
reset()
的媒体播放器对象之间的细微差别


错误后复位 基于此信息,类似于以下内容的内容可以解决您的问题:

 public boolean onError(MediaPlayer mp, int what, int extra)   
 {  
      Log.e(getPackageName(), String.format("Error(%s%s)", what, extra));
      playlist="ERROR";

      if(what == MediaPlayer.MEDIA_ERROR_SERVER_DIED)
          mp.reset();

      else if(what == MediaPlayer.MEDIA_ERROR_UNKNOWN)
          mp.reset();
      // Deal with any other errors you need to. 

      // I'm under the assumption you set the path to the song
      // and handle onPrepare, start(), etc with this function
      playSong(getApplicationContext(),currenturl);
      mplayer.setOnErrorListener(this);
      mplayer.setOnCompletionListener(this);
      mplayer.setOnPreparedListener(this);

      return true;  
 }  
有关潜在错误的列表,请参阅媒体播放器常数


设置错误侦听器 关于设置错误侦听器,我过去是如何实现的:

public class MediaPlayerActivity extends Activity implements OnCompletionListener,
    OnPreparedListener, AnimationListener, OnErrorListener{

    private MediaPlayer mediaPlayer;

    @Override
    public boolean onError(final MediaPlayer arg0, final int arg1, final int arg2) {
        // Error handling logic here
        return true;
    }

    protected void onResume(){
        super.onResume();
        // do some onResume logic
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnCompletionListener(this);
        mediaPlayer.setOnPreparedListener(this);
        // finish on resume and start up media player
    }
}

然后,我在onResume()启动的另一个函数中处理加载媒体播放器的问题。

您找到过这个问题的答案吗?我面临着类似的问题。