在android8.0之前,如果請求焦點使用了audiomanager.audiofocus_gain_transient_may_duck引數,它表明希望擁有了音訊焦點的其他應用降低音量來使用音訊,然而並不是所有的應用都會這樣做(也可能是開發者忘記優化),因為這並不是系統強制的。但是從android8.0開始,這個降低音量的工作就是系統預設行為了,可以說是乙個良心的優化。如果我不希望系統給我自動降低音量,而是想自己暫停音訊相關的工作,那咋辦?這個可以通過audiofocusrequest.builder.setwillpausewhenducked(true)方法取消系統的預設行為,然後通過監聽音訊焦點變化,來自己處理。
在請求音訊焦點的時候,我們需要監聽焦點的變化,以便做出正確的行為,我們需要設定並實現onaudiofocuschangelistener介面。
public inte***ce onaudiofocuschangelistener
根據引數int focuschange的值,我們需要做出合適的行為,而這些值大致可以分為兩種型別,一種是短暫失去焦點,另一種是永久失去焦點。
我們在專案中處理錄音的時候,需要去請求焦點,於是我做了乙個簡單的封裝,**如下:
public class audiofocusmanager implements audiomanager.onaudiofocuschangelistener
/** * request audio focus.
*/public void requestfocus()
mfocusrequest = new audiofocusrequest.builder(audiomanager.audiofocus_gain)
.setaudioattributes(maudioattributes)
.setwillpausewhenducked(true)
.setonaudiofocuschangelistener(this)
.build();
}result = maudiomanager.requestaudiofocus(mfocusrequest);
} else
if (monrequestfocusresultlistener != null)
}@override
public void onaudiofocuschange(int focuschange)
}/**
* release audio focus.
*/public void releaseaudiofocus() else
}/**
* handle the result of audio focus.
*/public inte***ce onrequestfocusresultlistener
public void setonhandleresultlistener(onrequestfocusresultlistener listener)
/** * same as audiomanager.onaudiofocuschangelistener.
*/public inte***ce onaudiofocuschangelistener
public void setonaudiofocuschangelistener(onaudiofocuschangelistener listener)
Android音訊焦點
ad 獲取音訊焦點 可以通過呼叫 requestaudiofocus 來實現,如果請求成功,返回 audiofocus request granted 您必須指定流型別 使用的是哪乙個流 和音訊焦點的型別 短暫的或是持久的 下面的 片斷演示了請求 音訊流的永久音訊焦點。abandon audio f...
Android 處理音訊焦點 AudioFocus
在給定的時間儘管只有乙個活動可以執行,但android是乙個多工環境。這對應用程式使用音訊造成了乙個特別大的難度,由於只有乙個音訊輸出,可能會有好幾個 服務爭奪使用它。android2.2之前,沒有內建機制來解決這個問題,這可能在某些情況下導致糟糕的使用者體驗。例如,乙個使用者正在聽 同時另乙個應用...
Android音訊焦點詳解(上)
private void initdata 10 非同步準備 mmediaplayer.prepareasync catch ioexception e 我們重點看一下第2步 申請焦點 通過audiomanager物件呼叫requestaudiofocus方法,有三個引數 onaudiofocusc...