語言

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#requestAudioFocus(AudioFocusRequest)AudioManager#abandonAudioFocusRequest(AudioFocusRequest)。

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

音訊聚焦是 API 8 中引入的概念。 它用來傳達使用者一次只能專注於單一音訊串流,例如聽音樂或播客,但無法同時聽兩件事。 在某些情況下,多個音訊串流可以同時播放,但使用者只會專注於其中一條,另一條則在背景播放。 例如,在音樂以較低音量播放(也就是蹲下)時,駕駛指示會被講解。

當應用程式請求音訊焦點時,表示它想「擁有」音訊焦點來播放音訊。 讓我們來檢視不同類型的焦點請求、請求後的回傳價值,以及損失時的回應。

注意:應用程式在獲得焦點前不應播放任何內容。

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

專注請求有四種類型。 成功對兩者進行聚焦請求後,系統與先前持有音訊聚焦的應用程式會產生不同行為。 <UL><LI>AudioManager#AUDIOFOCUS_GAIN 表示你的應用程式現在是使用者唯一正在收聽的音訊來源。 音訊播放的持續時間未知,且可能非常長:使用者在完成與應用程式互動後,不會期待下一次音訊串流會恢復。 這種聚焦增益的用途範例包括音樂播放、遊戲或影音播放器。</李>

<LI>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT 是針對這種情況,當你知道應用程式暫時從現有擁有者那裡取得焦點,但使用者期望播放在應用程式不再需要音訊焦點後,會回到原本的位置。 例如播放鬧鐘或在 VoIP 通話中。 播放是有限的:鬧鐘會逾時或被駁回,VoIP 通話有開始和結束。 當這些事件結束,且使用者在音樂開始時正在聽音樂,使用者預期音樂會恢復,但不希望同時聽兩個。</李>

<李>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中建AudioFocusRequest.Builder#Builder(int)構實例時,會傳遞該實例,或在複製帶有 AudioFocusRequest.Builder#setFocusGain(int)的現有實例後傳遞AudioFocusRequest.Builder#Builder(AudioFocusRequest)。

「注意」><b>注意:</b> 如果應用程式針對 Android 15(API 等級 35)或更高,除非是頂尖應用程式或執行前台服務,否則無法請求音訊聚焦。 此要求與音訊播放的要求相似。 若應用程式在不符合這些需求時請求音訊聚焦,該方法會回傳 <c>AudioManager#AUDIOFOCUS_REQUEST_FAILED</c>。 </旁白>

<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) 的 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler) 焦點聆聽器會被呼叫,通知應用程式它現在擁有音訊焦點。

<h4>暫停與蹲下</h4>

當應用程式請求音訊聚焦時 AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,系統會避開當前焦點擁有者。

注意:這種行為是 <Android>O</b> 的新設計,而針對 SDK 層級至 API 25 的應用程式,當收到焦點損失 AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK時,必須自行實作閃避。

但蹲下並不總是使用者預期的行為。 一個典型例子是,裝置在使用者聽有聲書或播客時播放駕駛路線,卻期望音訊播放暫停而非蹲下,因為難以同時理解導航提示與語音內容。 因此,當系統偵測到會閃避語音內容時,系統不會自動閃避:當玩家的語音 AudioAttributes 內容被 限定 AudioAttributes#CONTENT_TYPE_SPEECH時,才會偵測到。 AudioAttributes.Builder#setContentType(int) MediaPlayer#setAudioAttributes(AudioAttributes)例如,如果你正在撰寫有聲書、播客的媒體播放應用程式......由於系統不會自動閃避播放語音的應用程式,它會呼叫他們的焦點聆聽者來通知他們,AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK讓他們可以暫停。 請注意,此行為與 的使用 AudioFocusRequest是獨立的,但與 的使用 AudioAttributes相關。

如果你的應用程式需要暫停而不是蹲下,除了播放語音之外,你也可以用 宣告, Builder#setWillPauseWhenDucked(boolean)這樣系統會呼叫你的 focus lister,而不是自動蹲下。

<h4>範例</h4>

以下範例涵蓋了以下步驟,適用於任何播放音訊並使用音訊聚焦的應用程式。 這裡我們播放有聲書,應用程式在失去焦點時會暫停而非閃避。 這些步驟包括: <ul><li>創建 AudioAttributes 用於播放和焦點請求。</li><li>配置並建立 AudioFocusRequest 定義預期焦點行為的實例。</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.

Java 文件 android.media.AudioFocusRequest。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

屬性

名稱 Description
AudioAttributes

回傳此AudioAttributes設定的集合,若未設定則回傳AudioFocusRequest預設屬性。

Class

回傳此 Object的執行時類別。

(繼承來源 Object)
FocusGain

回傳為此 AudioFocusRequest設定的音訊聚焦請求類型。

Handle

底層 Android 實例的帳號。

(繼承來源 Object)
JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

一個用來封裝音訊焦點請求資訊的類別。

(繼承來源 JavaObject)
JniPeerMembers

一個用來封裝音訊焦點請求資訊的類別。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)
ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)

方法

名稱 Description
AcceptsDelayedFocusGain()

回傳使用此項的 AudioFocusRequest 應用程式是否支援在暫時請求失敗後獲得的焦點增益。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

一個用來封裝音訊焦點請求資訊的類別。

(繼承來源 JavaObject)
Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

一個用來封裝音訊焦點請求資訊的類別。

(繼承來源 JavaObject)
Equals(Object)

一個用來封裝音訊焦點請求資訊的類別。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

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

設定 Handle 屬性。

(繼承來源 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

一個用來封裝音訊焦點請求資訊的類別。

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

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

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

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
WillPauseWhenDucked()

回傳使用此方法 AudioFocusRequest 的應用程式在被要求蹲下時是否會暫停。

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

一個用來封裝音訊焦點請求資訊的類別。

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

一個用來封裝音訊焦點請求資訊的類別。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

一個用來封裝音訊焦點請求資訊的類別。

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

一個用來封裝音訊焦點請求資訊的類別。

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

一個用來封裝音訊焦點請求資訊的類別。

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

一個用來封裝音訊焦點請求資訊的類別。

(繼承來源 JavaObject)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

一個用來封裝音訊焦點請求資訊的類別。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於