【问题标题】:How to implement a MediaPlayer restart on errors in Android?如何在 Android 出现错误时实现 MediaPlayer 重启?
【发布时间】:2013-07-18 18:45:40
【问题描述】:

我正在尝试在 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 异常。

【问题讨论】:

  • 你找到答案了吗?我也面临着类似的问题。

标签: android android-mediaplayer


【解决方案1】:

概述

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

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

您当前所做的是停止并释放(mplayer.stop()mplayer.release())处于错误状态的媒体播放器。这应该会导致引发类似 IllegalStateException 的事情。如果它没有引发错误,您仍然会尝试在空对象中开始一首歌曲。而不是调用 stop 和 release 然后将变量设置为 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() 启动的函数中处理加载媒体播放器。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2020-02-05
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多