2009-05-22 211 views
7

我正在使用MediaPlayer實例來播放來自Internet位置的音頻文件。音頻播放器在單獨的活動中。用戶可以從音頻文件列表中進行選擇並來此活動播放音頻。Android - 查找音頻是否正在播放並停止播放

現在用戶可能會返回到先前的活動(使用列表)並選擇另一個音頻文件。在這種情況下,我想停止正在播放的其他任何音頻,並開始播放選定的新音頻。

有什麼方法可以知道音頻文件是否正在播放,而無需保留MediaPlayer對象?

謝謝。

編輯

我也瞭解如何知道聲音是否正在播放。 我們可以通過使用AudioManager的對象並調用isAudioPlaying()來完成。如果有任何音頻正在播放,這將返回true。

現在的另一個問題,我該如何停止正在播放的音頻?我沒有創建用於啓動音頻的MediaPlayer對象的實例(因爲用戶已經離開活動一次,並返回活動的新對象,因此MediaPlayer的新實例)

回答

10

您需要在MediaPlayer實例上調用stop()。爲了使你的應用程序這項工作,你要麼需要:

  • 呼叫stop()音頻播放活動中(在onDestroy()),例如
  • 創建Service播放音頻,並從與它進行通信這兩項活動

使用Service將讓你的代碼繼續運行該活動的生命週期之外,並且是像你這種情況下,需要堅持一個MediaPlayer對象的唯一途徑。

或者,您可能可以創建Application的自定義子類並將MediaPlayer存儲在那裏,但使用Service被認爲是更好的做法。

+0

謝謝。使用服務,靜態變量還是單例類會更好嗎?什麼是更好的設計選擇? – lostInTransit 2009-05-27 05:14:40

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 2012-12-06 13:03:19

2

@lostintransit「會不會更好使用一個服務,一個靜態變量或一個單獨的類會是什麼更好的設計選項?」

我認爲服務是你想要的。內置媒體播放器和潘多拉的應用程序都使用服務來確保音樂不受活動生命週期的束縛。

如果我明白你爲什麼要使用單身或靜態我不認爲它會完成你想要的。單例/靜態只能在Linux的單個進程中執行。如果您啓動您的活動,然後關閉它,然後再次啓動它們,它們將運行在不同的進程中。

1

試試這個......

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

其中MP1爲MediaPlayer

+1

如果mp1對象在應用程序關閉時已被銷燬,這將不起作用。 – sandalone 2012-12-06 13:02:55

1

我發現的方法來檢查音頻流(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; 
}