android音視訊指南-使用媒體會話media session
媒體會話與它所管理的播放器共存。您應該在擁有媒體會話及其關聯播放器的活動或服務的onCreate()
方法中建立並初始化一個媒體會話。
初始化媒體會話media session
新建立的媒體會話沒有功能。您必須通過執行以下步驟來初始化會話:
- 設定標誌,以便媒體會話可以接收來自媒體控制器和媒體按鈕的回撥。
- 建立並初始化一個
PlaybackStateCompat
例項,並將其分配給會話。回放狀態會在整個會話期間發生變化,因此我們建議快取PlaybackStateCompat.Builder
以便重用。 - 建立
MediaSessionCompat.CallBack
例項並將其分配給會話(更多關於回撥的內容見下文)。
您應該在擁有會話的活動或服務的onCreate()
方法中建立和初始化一個媒體會話。
為了讓媒體按鈕在應用程式新初始化(或停止)時正常工作,其PlaybackState
必須包含與媒體按鈕傳送的意圖匹配的play操作。這就是為什麼ACTION_PLAY
在初始化期間被分配給會話狀態。有關更多資訊,請參見對媒體按鈕的響應。
維護播放狀態和元資料
有兩個類表示媒體會話的狀態。
PlaybackStateCompat
類描述了播放器的當前操作狀態。這包括:
- 傳輸狀態(播放器是否在玩/暫停/緩衝,等等。看getState())
- 適用時的錯誤程式碼和可選錯誤訊息。(參見下面的getErrorCode()和讀取
- 播放器的位置
- 可以在當前狀態下處理的有效控制器操作
MediaMetadataCompat
類描述正在播放的材料:
- 藝術家、專輯和歌曲的名字
- 跟蹤持續時間
- 相簿藝術品顯示在鎖屏上。影象是一個最大大小為320x320dp的點陣圖(如果較大,則按比例縮小)。
contenturi
的一個例項,它指向一個更大版本的藝術品
播放器狀態和元資料可以在媒體會話的生命週期中發生變化。每當狀態或元資料發生更改時,您必須為每個類使用相應的生成器,即PlaybackStateCompat.Builder()
或MediaMetadataCompat.Builder()
,然後通過呼叫setPlaybackState()
狀態和錯誤
注意,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 level 14)開始,系統可以訪問媒體會話的回放狀態和元資料。這是鎖定螢幕如何顯示媒體控制元件和藝術品。這種行為會因Android版本的不同而有所不同。
專輯作品
在Android 4.0 (API level 14)及更高版本中,鎖定螢幕的背景會顯示出你的專輯封面——但前提是媒體會話元資料包含背景點陣圖。
傳輸控制
在Android 4.0 (API級別14)到Android 4.4 (API級別19)中,當媒體會話處於活動狀態,且媒體會話元資料包含背景點陣圖時,鎖屏螢幕會自動顯示傳輸控制元件。
在Android 5.0 (API level 21)或更高版本中,系統不提供鎖定螢幕上的傳輸控制。相反,您應該使用MediaStyle通知來顯示傳輸控制元件。
新增自定義操作
您可以使用addCustomAction()新增自定義操作。例如,新增一個控制元件來實現一個點讚的動作:
stateBuilder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder(
CUSTOM_ACTION_THUMBS_UP, mResources.getString(R.string.thumbs_up), thumbsUpIcon)
.setExtras(customActionExtras)
.build());
@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
...
}
}
媒體會話回撥
主媒體會話回撥方法是onPlay()
、onPause()
和onStop()
。這是您新增控制播放器的程式碼的地方。
由於在執行時例項化並設定會話回撥(在onCreate()
中),應用程式可以定義使用不同播放器的替代回撥,並根據裝置和/或系統級別選擇適當的回撥/播放器組合。你可以在不改變應用程式其餘部分的情況下改變播放器。例如,你可以在Android 4.1 (API level 16)或更高版本上使用ExoPlayer,在早期的系統上使用MediaPlayer。
除了控制播放器和管理媒體會話狀態轉換外,回撥還啟用和禁用應用程式的特性,並控制它與其他應用程式和裝置硬體互動的方式。(參見控制音訊輸出)。
媒體會話回撥方法的實現取決於應用程式的結構。請參閱分別描述如何在音訊應用程式和視訊應用程式中使用回撥的頁面,描述每種應用程式的回撥應該如何實現。