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

时间:2013-07-18 18:45:41

标签: android android-mediaplayer

我正在尝试在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";

        }



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

}

我是否正确设置了听众?我不知道在哪里放置onError函数所以我有2个。当我通过将手机设置为飞行模式来模拟错误时,监听器将触发“RELOADING”和“RELOADING ERROR”标题。但是在网络开启后,播放器不会重启。没有声音。

这里有什么问题?玩家无法重启。

请帮助使代码可行。也可以是连接跳过和IO异常。

1 个答案:

答案 0 :(得分:9)

概述

我遇到了类似的问题,根据文档显示,您需要做的就是重置媒体播放器:

  

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

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

另一种选择是发起一个新的媒体播放器,但documentation详细说明了新实例化的MediaPlayer对象与已调用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;  
 }  

请参阅媒体播放器常量documentation以获取潜在错误列表。


设置错误侦听器

至于设置错误监听器,以下是我过去实现它的方式:

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()启动的另一个函数中加载媒体播放器。