android 播放声音 停止其他,Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题,暂停其他的播放...
盡管某個時刻只有一個
activity
可以運行,
Android
卻是一個多任務環境.這對使用音頻的應用帶來了特殊的挑戰,因為只有一個音頻輸出而可能多個媒體都想用它.在
Android2.2
之前,沒有內建的機制來處理這個問題,所以可能在某些情況下導致壞的用戶體驗.例如,當一個用戶正在聽音樂而另一個應用需要通知用戶一些重要的事情時,用戶可能由于音樂聲音大而不能聽的通知.從
Android2.2
開始,平臺為應用提供了一個協商它們如何使用設備音頻輸出的途徑,這個機制叫做音頻焦點,AudioManager。
當你的應用需要輸出像樂音和通知之類的音頻時,你應該總是請求音頻焦點.一旦應用具有了焦點,它就可以自由的使用音頻輸出.但它總是應該監聽焦點的變化.如果被通知丟失焦點,它應該立即殺死聲音或降低到靜音水平(有一個標志表明應選擇哪一個)并且僅當重新獲得焦點后才恢復大聲播放。
首先,注冊一個焦點監聽器OnAudioFocusChangeListener 。
privateAudioManager.OnAudioFocusChangeListener?mAudioFocusChangeListener?=null;
//Build.VERSION.SDK_INT表示當前SDK的版本,Build.VERSION_CODES.ECLAIR_MR1為SDK?7版本?,
//因為AudioManager.OnAudioFocusChangeListener在SDK8版本開始才有。
if(Build.VERSION.SDK_INT?>?Build.VERSION_CODES.ECLAIR_MR1){
mAudioFocusChangeListener?=?newAudioManager.OnAudioFocusChangeListener()?{
@Override
publicvoidonAudioFocusChange(intfocusChange)?{
if(focusChange?==?AudioManager.AUDIOFOCUS_LOSS){
//失去焦點之后的操作
if(isPlaying()){
pause();
}
}elseif(focusChange?==?AudioManager.AUDIOFOCUS_GAIN){
//獲得焦點之后的操作
}
}
};
}
要請求音頻焦點,你必須從AudioManager mAudioMgr調用requestAudioFocus(),如下所示:
privatevoidrequestAudioFocus()?{
if(Build.VERSION.SDK_INT?<=?Build.VERSION_CODES.ECLAIR_MR1){
return;
}
if(mAudioMgr?==null)
mAudioMgr?=?(AudioManager)?ApplicationEx.app
.getSystemService(Context.AUDIO_SERVICE);
if(mAudioMgr?!=null)?{
DLog.i(TAG,?"Request?audio?focus");
intret?=?mAudioMgr.requestAudioFocus(mAudioFocusChangeListener,
AudioManager.STREAM_MUSIC,?AudioManager.AUDIOFOCUS_GAIN);
if(ret?!=?AudioManager.AUDIOFOCUS_REQUEST_GRANTED)?{
DLog.i(TAG,?"request?audio?focus?fail.?"+?ret);
}
}
}
放棄焦點
privatevoidabandonAudioFocus()?{
if(Build.VERSION.SDK_INT?<=?Build.VERSION_CODES.ECLAIR_MR1){
return;
}
if(mAudioMgr?!=null)?{
DLog.i(TAG,?"Abandon?audio?focus");
mAudioMgr.abandonAudioFocus(mAudioFocusChangeListener);
mAudioMgr?=?null;
}
}
參數focusChange告訴你音頻焦點如何發生了變化,它可以是以上幾種值(它們都是定義在AudioManager中的常量):
AUDIOFOCUS_GAIN:你已獲得了音頻焦點.
AUDIOFOCUS_LOSS:你已經丟失了音頻焦點比較長的時間了.你必須停止所有的音頻播放.因為預料到你可能很長時間也不能再獲音頻焦點,所以這里是清理你的資源的好地方.比如,你必須釋放MediaPlayer.
AUDIOFOCUS_LOSS_TRANSIENT:你臨時性的丟掉了音頻焦點,很快就會重新獲得.你必須停止所有的音頻播放,但是可以保留你的資源,因為你可能很快就能重新獲得焦點.
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你臨時性的丟掉了音頻焦點,但是你被允許繼續以低音量播放,而不是完全停止.
當第三方播放器也使用了這個機制的話,當你的應用獲取聲音焦點之后,第三方播放器失去焦點,做了暫停處理,即會停止播放。這樣就不會出現兩個播放器同時播放音樂的情況了。而如果第三方播放器沒有經過處理,不管有沒有焦點都一直播放,那就沒有辦法了。 =。=||
總結
以上是生活随笔為你收集整理的android 播放声音 停止其他,Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题,暂停其他的播放...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ADO连接各种数据库
- 下一篇: android点击不同次切换不同图片,A