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() を呼び出してオブジェクトを Idle 状態に戻すことができます。

現在行っていることは、エラー状態のメディア プレーヤーを停止して解放 (mplayer.stop()および) することです。mplayer.release()これにより、IllegalStateException のようなものが発生するはずです。エラーがスローされていない場合でも、null オブジェクトで曲を開始しようとしています。stop と release を呼び出して変数を null に設定する代わりに、mplayer.reset()関数を使用する必要があります。

もう 1 つのオプションは、新しいメディア プレーヤーを開始することですが、ドキュメントでは、新しくインスタンス化された 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 に答える