9

我正在尝试在发生错误时(与服务器的连接丢失、网络无法访问等)在 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 异常。

4

1 回答 1

10

概述

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

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

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

另一种选择是启动一个新的媒体播放器,但文档详细说明了新实例化的 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() 启动的函数中处理加载媒体播放器。

于 2013-12-28T17:59:44.257 回答