2009-05-22 8 views
7

私は、インターネットロケーションからオーディオファイルをストリーミングするためにMediaPlayerインスタンスを使用しています。オーディオプレーヤーは別のアクティビティにあります。ユーザは、オーディオファイルのリストから選択し、このアクティビティでオーディオを再生することができます。Android - オーディオが現在再生中であるかどうかを確認して停止します

これで、ユーザは以前のアクティビティ(リスト付き)に戻り、別のオーディオファイルを選択する可能性があります。この場合、再生中の他のオーディオを停止し、選択した新しいオーディオの再生を開始したいと考えています。

MediaPlayerオブジェクトを保持しなくてもオーディオファイルが再生されているかどうかわかりますか?

ありがとうございました。

編集

私は、オーディオが再生されているかどうかを知る方法を発見しました。 AudioManagerのオブジェクトを使用し、isAudioPlaying()を呼び出すことでこれを行うことができます。オーディオが再生されている場合はtrueを返します。

他の質問現在再生中のオーディオを停止するにはどうすればよいですか?私は、オーディオを開始するために作成されたMediaPlayerオブジェクトのインスタンスを持っていません(ユーザは既にアクティビティを一度残していて、アクティビティの新しいオブジェクト、したがってMediaPlayerの新しいインスタンスに戻っています)

答えて

10

MediaPlayerインスタンスでstop()に電話する必要があります。

  • onDestroy()中)オーディオ再生活動中のコールstop()、例えば
  • は、オーディオを再生するServiceを作成し、からそれと通信:あなたのアプリケーションでこの作業を行うには、次のことが必要になりますどちらかServiceを使用して、両方の活動

は、あなたのコードは、アクティビティのライフサイクルの外で実行を継続することができ、あなたが、この場合には必要のようMediaPlayerオブジェクトを永続化する唯一の方法であるだろう。

Applicationのカスタムサブクラスを作成してそこにMediaPlayerを格納することもできますが、Serviceを使用する方がより適切と考えられます。ここで

+0

感謝を。サービス、静的変数、またはシングルトンクラスを使用する方が良いでしょうか?より良いデザインオプションは何でしょうか? – lostInTransit

2

は、オーディオの再生が完了するまで、スリープ状態にいくつかの便利なコードです:?

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
    while(manager.isMusicActive()) 
    { 
     Log.d("music", "music is active"); 
     try 
     { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) 
     { 
      Log.e("music", "interrupted waiting for music to stop"); 
     } 
     Log.d("music", "done playing music"); 
    } 
+1

これは何もせず、誰かがそれを有用にすることはほとんどありません – sandalone

2

@lostintransitは、「よりよい設計オプションになりますどのようなサービス、静的変数またはシングルトンクラスを使う方が良いでしょう? "

サービスはあなたが望むものだと思います。ビルトインメディアプレーヤーとPandoraのアプリはどちらも、音楽がアクティビティライフサイクルに縛られていないことを保証するサービスを使用しています。

シングルトンやスタティックを使用する理由を理解していれば、自分が望むものを達成するとは思えません。シングルトン/スタティックは、Linuxの単一のプロセス内でのみ強制されます。アクティビティを起動して終了し、再度起動すると、別のプロセスで実行されます。

1

試用MP1はMediaPlayer

+1

mp1オブジェクトがアプリケーションの終了時に破棄された場合、これは機能しません。 – sandalone

1

ある

if (mp1 != null && mp1.isPlaying()) { 
       mp1.stop(); 
      } 

私は、オーディオストリーム(AudioManager.STREAM_RING、AudioManager.STREAM_NOTIFICATIONおよびなど)リフレクションを使用して、現在ビジー状態であるかどうかを確認する方法を見つけた:

/** 
* Unhide android api: check is stream is active now (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION...), 
* uses reflection 
* @param audioStream 
* @return 
*/ 
public static boolean isStreamActive(int audioStream) { 
    Class<?> audioSystemClazz = null; 
    Boolean res = false; 
    try { 
     audioSystemClazz = Class.forName("android.media.AudioSystem"); 
     if (null != audioSystemClazz) { 
      // isStreamActive 
      Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class, 
        int.class }); 
      if (null != method) { 
       res = (Boolean) method.invoke(null, audioStream, 0); 
      } 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

    return res; 
} 
関連する問題