翻譯自Using a media sessionhtml
媒體會話與它所管理的播放器共存。您應該在擁有媒體會話及其關聯播放器的活動或服務的onCreate()
方法中建立並初始化一個媒體會話。java
注意:編寫媒體應用程序的最佳實踐是使用media-compat庫。在本頁中,術語「媒體會話」指的是MediaSessionCompat的實例,而「媒體控制器」指的是MediaControllerCompat的實例。android
新建立的媒體會話沒有功能。您必須經過執行如下步驟來初始化會話:git
PlaybackStateCompat
實例,並將其分配給會話。播放狀態會在整個會話期間發生變化,所以咱們建議緩存PlaybackStateCompat.Builder
以便重用。MediaSessionCompat.CallBack
實例並將其分配給會話(更多關於回調的內容見下文)。您應該在擁有會話的活動或服務的onCreate()
方法中建立和初始化一個媒體會話。github
爲了讓媒體按鈕在應用程序新初始化(或中止)時正常工做,其PlaybackState
必須包含與媒體按鈕發送的意圖匹配的play操做。這就是爲何ACTION_PLAY
在初始化期間被分配給會話狀態。有關更多信息,請參見對媒體按鈕的響應。緩存
有兩個類表示媒體會話的狀態。bash
PlaybackStateCompat
類描述了播放器的當前操做狀態。這包括:session
MediaMetadataCompat
類描述正在播放的材料:app
contenturi
的一個實例,它指向一個更大版本的藝術品播放器狀態和元數據能夠在媒體會話的生命週期中發生變化。每當狀態或元數據發生更改時,您必須爲每一個類使用相應的生成器,即PlaybackStateCompat.Builder()
或MediaMetadataCompat.Builder()
,而後經過調用setPlaybackState()或setMetaData()將新實例傳遞給媒體會話。爲了減小這些頻繁操做的總內存消耗,最好一次性建立構建器,並在會話的整個生命週期中重用它們。ide
注意,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());
複製代碼
有關完整示例,請參閱Universal Music Player。
您可使用onCustomAction()來響應該操做。
@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
...
}
}
複製代碼
這裏也能夠參閱Universal Music Player
主媒體會話回調方法是onPlay()
、onPause()
和onStop()
。這是您添加控制播放器的代碼的地方。
因爲在運行時實例化並設置會話回調(在onCreate()
中),應用程序能夠定義使用不一樣播放器的替代回調,並根據設備和/或系統級別選擇適當的回調/播放器組合。你能夠在不改變應用程序其他部分的狀況下改變播放器。例如,你能夠在Android 4.1 (API level 16)或更高版本上使用ExoPlayer,在早期的系統上使用MediaPlayer。
除了控制播放器和管理媒體會話狀態轉換外,回調還啓用和禁用應用程序的特性,並控制它與其餘應用程序和設備硬件交互的方式。(參見控制音頻輸出)。
媒體會話回調方法的實現取決於應用程序的結構。請參閱分別描述如何在音頻應用程序和視頻應用程序中使用回調的頁面,描述每種應用程序的回調應該如何實現。