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

我试图在Android中实现MediaPlayer的重启,当发生错误(连接服务器丢失,networking无法访问等)。 我见过很多代码示例,但都有些不符合标准。 我认为必须有一个标准的方式来重新启动相应的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"; } } ////////////// .... } 

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

这里有什么问题? 播放器无法重新启动。

请帮助使代码可行。 也可以连接跳过和IOexception。

Solutions Collecting From Web of "如何在Android中的错误实现MediaPlayer重新启动?"

概观

我遇到了一个类似的问题,根据文档,它表明你需要做的就是重置你的媒体播放器:

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

你现在正在做的是停止并释放( mplayer.stop()mplayer.release() )处于错误状态的媒体播放器。 这应该导致类似IllegalStateExceptionexception被引发。 如果不是抛出一个错误,你仍然会试图在一个空对象中开始一首歌曲。 而不是调用停止和释放,然后将variables设置为null,您应该使用mplayer.reset()函数。

另一个select是启动一个新的媒体播放器,但是这个文档详细说明了一个新实例化的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; } 

有关潜在错误的列表,请参阅媒体播放器常量文档 。

设置错误侦听器

至于设置错误侦听器,以下是我过去如何实现它:

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