Share via


AudioFocusRequestClass 類別

定義

用來封裝音訊焦點要求相關資訊的類別。

[Android.Runtime.Register("android/media/AudioFocusRequest", ApiSince=26, DoNotGenerateAcw=true)]
public sealed class AudioFocusRequestClass : Java.Lang.Object
[<Android.Runtime.Register("android/media/AudioFocusRequest", ApiSince=26, DoNotGenerateAcw=true)>]
type AudioFocusRequestClass = class
    inherit Object
繼承
AudioFocusRequestClass
屬性

備註

用來封裝音訊焦點要求相關資訊的類別。 AudioFocusRequest實例是由 Builder 所建置,用來分別使用 和 AudioManager#abandonAudioFocusRequest(AudioFocusRequest) 來要求和放棄音訊焦點 AudioManager#requestAudioFocus(AudioFocusRequest)

<h3 > 什麼是音訊焦點? </h3>

音訊焦點是 API 8 中引進的概念。 它用來傳達使用者一次只能專注于單一音訊串流的事實,例如接聽音樂或播客,但不能同時同時兩者。 在某些情況下,多個音訊串流可以同時播放,但只有一個使用者真的會接聽 (焦點放在) ,而另一個則是在背景播放。 其中一個範例是,在音樂在減少的音量 () 播放時,正在推動說出方向。

當應用程式要求音訊焦點時,它會表達其意圖「擁有」音訊焦點來播放音訊。 讓我們檢閱不同類型的焦點要求、要求之後的傳回值,以及對遺失的回應。 <p class=「note」 > 注意:應用程式在授與焦點之前不應該播放任何內容。

<h3 > 不同類型的焦點要求 < /h3>

有四種焦點要求類型。 成功的焦點要求會讓系統和其他先前保留音訊焦點的應用程式產生不同的行為。 <ul >< li >AudioManager#AUDIOFOCUS_GAIN 表示您的應用程式現在是使用者正在接聽的唯一音訊來源。 音訊播放的持續時間不明,而且可能很長:使用者完成與應用程式互動之後, () 他不會預期另一個音訊資料流程繼續。 此焦點取得的範例適用于音樂播放、遊戲或視訊播放程式。 </李>

<li >AudioManager#AUDIOFOCUS_GAIN_TRANSIENT 適用于您知道應用程式暫時從目前擁有者擷取焦點的情況,但使用者預期播放會回到應用程式不再需要音訊焦點之後的位置。 例如,播放警示或在 VoIP 通話期間。 播放已知為有限:警示將會逾時或關閉,VoIP 通話有開始和結束。 當其中任何一個事件結束時,如果使用者在啟動時接聽音樂,則使用者預期音樂會繼續,但不想同時接聽兩者。 </李>

<li >AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK :此焦點要求類型類似于 AUDIOFOCUS_GAIN_TRANSIENT 焦點要求的暫存層面,但它也會表示您在擁有焦點期間的事實,可讓您讓另一個應用程式在減少的磁片區「擷取」時繼續播放。 範例是播放駕駛方向或通知時,音樂可以繼續播放,但不夠大聲,導致方向難以理解。 「小子」應用程式的一般衰減是 0.2f (或 -14dB) 的因數,例如,使用這個類別播放時可以套用 MediaPlayer.setVolume(0.2f) 。 </李>

<li >AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 也適用于暫時要求,但也表示您的應用程式預期裝置不會播放任何其他專案。 如果您執行音訊錄製或語音辨識,而且不想讓系統在該時間播放範例通知,通常會使用此方式。 </li >< /ul>

AudioFocusRequest實例一律包含上述四種要求類型的其中一種。 它會在建構 AudioFocusRequest.Builder#Builder(int) 函式中使用 Builder 其產生器建置 AudioFocusRequest 實例時傳遞,或在 AudioFocusRequest.Builder#setFocusGain(int) 複製具有 的現有實例 AudioFocusRequest.Builder#Builder(AudioFocusRequest) 之後傳遞。

<h3 > 限定您的焦點要求 < /h3 >< h4 需要焦點要求 < /h4 > 的使用案例>

任何焦點要求都由 AudioAttributes (限定,請參閱 Builder#setAudioAttributes(AudioAttributes)) 描述在要求成功或授與) 之後,將會遵循要求 (的音訊使用案例。 建議您針對要求使用與用於音訊/媒體播放的屬性相同 AudioAttributes 。 <br > 如果未設定任何屬性,則會使用 的預設屬性 AudioAttributes#USAGE_MEDIA

<h4 > 延遲焦點 < /h4>

系統可能會因為許多原因而「鎖定」音訊焦點:在通話期間,當裝置連線的汽車播放緊急訊息時...為了支援這些情況,應用程式可以要求在要求完成時收到通知,方法是將其要求標示為接受延遲焦點,並加上 Builder#setAcceptsDelayedFocusGain(boolean) 。 <br > 如果系統鎖定時要求焦點, AudioManager#requestAudioFocus(AudioFocusRequest) 將會傳回 AudioManager#AUDIOFOCUS_REQUEST_DELAYED 。 當焦點不再鎖定時,會呼叫 設定為 或 的 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler) 焦點接聽程式 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener) ,以通知應用程式現在擁有音訊焦點。

<h4 > 暫停與擷取 < /h4>

當應用程式要求具有 AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 的音訊焦點時,系統會讓目前的焦點擁有者無所及。 <p class=「note」Note「 > 注意:此行為是 >< Android O < /b > 的新功能,而目標為 SDK 層級的應用程式必須在收到焦點遺失 AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 時實作擷取本身。

但擷取不一定是使用者預期的行為。 典型的範例是當裝置在使用者接聽音訊簿或播客時播放駕駛方向,並預期音訊播放會暫停,而不是擷取,因為很難同時瞭解導覽提示和口說內容。 因此,當系統偵測到它時,系統不會自動降低其口語內容:當玩家的 限定 AudioAttributes#CONTENT_TYPE_SPEECHAudioAttributes ,就會偵測到這類內容。 例如 AudioAttributes.Builder#setContentType(int)MediaPlayer#setAudioAttributes(AudioAttributes) ,如果您撰寫音訊書籍、播客的媒體播放應用程式...由於系統不會自動調整播放語音的應用程式,因此會改為呼叫焦點接聽程式來通知它們 AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK ,以便改為暫停。 請注意,此行為與 使用 AudioFocusRequest 無關,但系結至 的使用 AudioAttributes

如果您的應用程式需要暫停而不是因播放語音以外的任何其他原因而暫停,您也可以使用 Builder#setWillPauseWhenDucked(boolean) 宣告 ,這會導致系統呼叫您的焦點接聽程式,而不是自動減少。

<h4 > 範例 < /h4>

下列範例涵蓋可在任何播放音訊的應用程式中找到下列步驟,以及使用音訊焦點。 在這裡,我們會播放音訊書籍,而我們的應用程式是為了在失去焦點時暫停而非無聲。 這些步驟包含: < ul >< li > Create AudioAttributes 用於播放和焦點要求。 </li li >>< Configuring and creating AudioFocusRequest the instance that defines the intended focus behaviors. </li li ><> 要求音訊焦點並檢查傳回碼,以查看播放是否可以立即發生或延遲。 </li li ><> 實作焦點變更接聽程式,以回應焦點增益和損失。 </li >< /ul>

// initialization of the audio attributes and focus request
            mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
            mPlaybackAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .build();
            mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                    .setAudioAttributes(mPlaybackAttributes)
                    .setAcceptsDelayedFocusGain(true)
                    .setWillPauseWhenDucked(true)
                    .setOnAudioFocusChangeListener(this, mMyHandler)
                    .build();
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setAudioAttributes(mPlaybackAttributes);
            final Object mFocusLock = new Object();

            boolean mPlaybackDelayed = false;

            // requesting audio focus
            int res = mAudioManager.requestAudioFocus(mFocusRequest);
            synchronized (mFocusLock) {
                if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
                    mPlaybackDelayed = false;
                } else if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                    mPlaybackDelayed = false;
                    playbackNow();
                } else if (res == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
                   mPlaybackDelayed = true;
                }
            }

            // implementation of the OnAudioFocusChangeListener
            &#64;Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AudioManager.AUDIOFOCUS_GAIN:
                        if (mPlaybackDelayed || mResumeOnFocusGain) {
                            synchronized (mFocusLock) {
                                mPlaybackDelayed = false;
                                mResumeOnFocusGain = false;
                            }
                            playbackNow();
                        }
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS:
                        synchronized (mFocusLock) {
                            // this is not a transient loss, we shouldn't automatically resume for now
                            mResumeOnFocusGain = false;
                            mPlaybackDelayed = false;
                        }
                        pausePlayback();
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        // we handle all transient losses the same way because we never duck audio books
                        synchronized (mFocusLock) {
                            // we should only resume if playback was interrupted
                            mResumeOnFocusGain = mMediaPlayer.isPlaying();
                            mPlaybackDelayed = false;
                        }
                        pausePlayback();
                        break;
                }
            }

            // Important:
            // Also set "mResumeOnFocusGain" to false when the user pauses or stops playback: this way your
            // application doesn't automatically restart when it gains focus, even though the user had
            // stopped it.

android.media.AudioFocusRequest JAVA 檔。

此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。

屬性

AudioAttributes

AudioAttributes 回這個 AudioFocusRequest 的集合,如果沒有設定,則傳回預設屬性。

Class

傳回這個 Object 的執行時間類別。

(繼承來源 Object)
FocusGain

傳回為此 AudioFocusRequest 設定的音訊焦點要求類型。

Handle

基礎 Android 實例的控制碼。

(繼承來源 Object)
JniIdentityHashCode

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
JniPeerMembers

用來封裝音訊焦點要求相關資訊的類別。

PeerReference

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
ThresholdClass

此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。

(繼承來源 Object)
ThresholdType

此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。

(繼承來源 Object)

方法

AcceptsDelayedFocusGain()

傳回使用此應用程式 AudioFocusRequest 是否支援暫時要求失敗之後授與的焦點取得。

Clone()

建立並傳回這個 物件的複本。

(繼承來源 Object)
Dispose()

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
Dispose(Boolean)

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
Equals(Object)

指出其他物件是否「等於」這個物件。

(繼承來源 Object)
GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()

當垃圾收集判斷物件沒有其他參考時,由物件上的垃圾收集行程呼叫。

(繼承來源 Object)
Notify()

喚醒正在等候此物件的監視器的單一線程。

(繼承來源 Object)
NotifyAll()

喚醒正在等候此物件監視器的所有線程。

(繼承來源 Object)
SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
ToArray<T>()

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
Wait()

讓目前的執行緒等到喚醒為止,通常是藉由 < em > notified < /em > 或 < em > interrupted < /em > 來喚醒。

(繼承來源 Object)
Wait(Int64)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)
Wait(Int64, Int32)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)
WillPauseWhenDucked()

傳回應用程式是否要在要求擷子時暫停使用此應用程式 AudioFocusRequest

明確介面實作

IJavaPeerable.Disposed()

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
IJavaPeerable.DisposeUnlessReferenced()

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
IJavaPeerable.Finalized()

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
IJavaPeerable.JniManagedPeerState

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

用來封裝音訊焦點要求相關資訊的類別。

(繼承來源 Object)

擴充方法

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

用來封裝音訊焦點要求相關資訊的類別。

GetJniTypeName(IJavaPeerable)

用來封裝音訊焦點要求相關資訊的類別。

適用於