我正在尝试在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异常。
答案 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()启动的另一个函数中加载媒体播放器。