使用媒體工作階段

媒體工作階段提供一種與音訊或視訊互動的方式 廣告。告知 Android 應用程式正在播放媒體, 您授予應用程式控制項的權限整合媒體工作階段後 應用程式,用於在外部宣傳媒體及接收播放指令 從外部來源擷取這些來源可以是實體按鈕 (例如播放 按鈕) 或間接指令 (例如 指示「暫停」這類工作。接著,媒體工作階段會委派這些來源 在應用程式中套用這些指令 並在指令的來源位置公開透明

媒體工作階段會與管理的播放器一起運作。應建立 並在活動的 onCreate() 方法中初始化媒體工作階段,或是 服務,以及擁有該媒體工作階段的播放器。

初始化媒體工作階段

新建立的媒體工作階段沒有任何功能。如要初始化工作階段,請執行下列步驟:

  • 設定旗標,讓媒體工作階段接收來自媒體控制器和媒體按鈕的回呼。
  • 建立並初始化 PlaybackStateCompat 的執行個體,並指派給工作階段。播放狀態在整個工作階段期間都會改變,因此建議快取 PlaybackStateCompat.Builder 以重複使用。
  • 建立 MediaSessionCompat.Callback 的執行個體並指派給工作階段 (如要進一步瞭解回呼,請參閱下方說明)。

您應在以下項目的 onCreate() 方法中建立並初始化媒體工作階段: 活動 或擁有該工作階段的「服務」

為確保媒體按鈕正常運作 當應用程式剛初始化 (或停止) 時,其 PlaybackState 必須 包含與媒體按鈕傳送的意圖相符的播放動作。這是 為何 ACTION_PLAY 在 和初始化。詳情請參閱回應媒體 按鈕

維持播放狀態和中繼資料

有兩個類別,用來代表媒體工作階段的狀態。

PlaybackStateCompat 類別可說明播放器目前的運作狀態。這類功能包括:

  • 傳輸狀態 (播放器是否正在播放/暫停/緩衝處理等。請參閱 getState())
  • 錯誤代碼和選用的錯誤訊息 (如適用)。(請參閱 getErrorCode() 以及下方的狀態和錯誤)。
  • 播放器位置
  • 目前狀態可處理的有效控制器動作

MediaMetadataCompat 類別可說明播放的內容:

  • 演出者、專輯及曲目的名稱
  • 音軌時間長度
  • 要在螢幕鎖定畫面上顯示的專輯圖片。此圖片是點陣圖,大小上限為 320x320dp (如果較大,則會縮小)。
  • 指向較大圖片版本的 ContentUris 例項

播放器狀態和中繼資料可能會在媒體工作階段的生命週期內改變。每次狀態或中繼資料變更時,您必須為每個類別 (PlaybackStateCompat.Builder()MediaMetadataCompat.Builder()) 使用對應的建構工具,然後透過呼叫方式將新的例項傳遞至媒體工作階段 setPlaybackState()setMetaData()。 為了減少這些常用作業的整體記憶體消耗量,建議您建立一次建構工具,並在整個工作階段期間重複使用。

狀態和錯誤

請注意,PlaybackState 物件包含個別 工作階段的播放狀態 (getState()) 並視需要顯示相關的錯誤代碼 (getErrorCode())。 錯誤可能是嚴重或不嚴重的錯誤:

每當播放中斷時,您都會產生嚴重錯誤:將 將狀態傳輸至 STATE_ERROR,並指定與 setErrorMessage(int, CharSequence) 相關聯的錯誤。 只要錯誤導致播放內容遭錯誤封鎖,PlaybackState 應能繼續 回報 STATE_ERROR 和錯誤。

如果應用程式無法處理要求,但可以繼續播放,就會發生一般錯誤: 傳輸仍維持在「正常」狀態 (例如 STATE_PLAYING),但 PlaybackState 仍保留錯誤代碼。 舉例來說,如果正在播放最後一首歌,且使用者要求跳到下一首歌, 播放可以繼續,但您應以錯誤代碼 ERROR_CODE_END_OF_QUEUE 建立新的 PlaybackState,並 然後呼叫 setPlaybackState()。附加至工作階段的媒體控制器會收到回呼 onPlaybackStateChanged(),並向使用者說明情況。一次非嚴重錯誤應只回報一次。下次工作階段更新 PlaybackState 時,並未再次設定相同的非重大錯誤 (除非回應新的要求時發生錯誤)。

媒體工作階段螢幕鎖定畫面

從 Android 4.0 (API 級別 14) 開始,系統可以存取媒體工作階段的 播放狀態和中繼資料螢幕鎖定畫面會顯示媒體控制項的方式 和圖片。行為會因為 Android 版本。

專輯封面

在 Android 4.0 (API 級別 14) 至 Android 10 (API 級別 29) 中,背景 螢幕鎖定畫面會顯示專輯圖片,但僅限媒體工作階段 中繼資料會包含背景點陣圖。

傳輸控制項

在 Android 4.0 (API 級別 14) 至 Android 4.4 (API 級別 19) 中,當媒體工作階段處於啟用狀態,且媒體工作階段中繼資料含有背景點陣圖時,螢幕鎖定畫面會自動顯示傳輸控制項。

在 Android 5.0 (API 級別 21) 以上版本中,系統未提供傳輸功能 。建議您改用 MediaStyle 通知 即可顯示傳輸控制項。

新增自訂動作

媒體應用程式可定義自訂動作;例如:表示喜歡、喜歡或 倒轉 30 秒。自訂動作應實作全新的行為。正確做法 未使用自訂動作取代其中一項標準傳輸控制動作 PlaybackStateCompat

使用 addCustomAction() 新增自訂動作。以下範例說明如何新增「喜歡」動作的控制項:

Kotlin

stateBuilder.addCustomAction(
        PlaybackStateCompat.CustomAction.Builder(
                CUSTOM_ACTION_THUMBS_UP,
                resources.getString(R.string.thumbs_up),
                thumbsUpIcon
        ).run {
            setExtras(customActionExtras)
            build()
        }
)

Java

stateBuilder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder(
    CUSTOM_ACTION_THUMBS_UP, resources.getString(R.string.thumbs_up), thumbsUpIcon)
    .setExtras(customActionExtras)
    .build());

如需完整範例,請參閱通用音樂播放器

您使用「onCustomAction()」回應動作。

Kotlin

override fun onCustomAction(action: String, extras: Bundle?) {
    when(action) {
        CUSTOM_ACTION_THUMBS_UP -> {
            ...
        }
    }
}

Java

@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
    if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
        ...
    }
}

另請參閱通用音樂播放器

媒體工作階段回呼

主要媒體工作階段回呼方法為 onPlay()onPause()onStop()。 請在這裡新增用來控製播放器的程式碼。

由於您在執行階段 (在 onCreate() 中) 將工作階段的回呼例項化及設定,因此應用程式可以定義使用不同的播放器的替代回呼,並根據裝置和/或系統層級選擇適當的回呼/播放器組合。您可以變更播放器,而不變更應用程式的其餘部分。舉例來說,您可以在 Android 4.1 (API 級別 16) 以上版本中執行 ExoPlayer,並在舊版系統中使用 MediaPlayer

除了控製播放器及管理媒體工作階段狀態轉換外,回呼也會啟用及停用應用程式功能,並控制與其他應用程式和裝置硬體互動的方式。(請參閱控制音訊輸出)。

媒體工作階段回呼方法的實作方式取決於應用程式的結構。 請參閱其他頁面,瞭解如何在網頁中使用回呼: 音訊應用程式影片應用程式 說明如何為各種應用程式實作回呼。