android音視頻指南-使用媒體會話media session

翻譯自Using a media sessionhtml

媒體會話與它所管理的播放器共存。您應該在擁有媒體會話及其關聯播放器的活動或服務的onCreate()方法中建立並初始化一個媒體會話。java

注意:編寫媒體應用程序的最佳實踐是使用media-compat庫。在本頁中,術語「媒體會話」指的是MediaSessionCompat的實例,而「媒體控制器」指的是MediaControllerCompat的實例。android

初始化媒體會話media session

新建立的媒體會話沒有功能。您必須經過執行如下步驟來初始化會話:git

  • 設置標誌,以便媒體會話能夠接收來自媒體控制器和媒體按鈕的回調。
  • 建立並初始化一個PlaybackStateCompat實例,並將其分配給會話。播放狀態會在整個會話期間發生變化,所以咱們建議緩存PlaybackStateCompat.Builder以便重用。
  • 建立MediaSessionCompat.CallBack實例並將其分配給會話(更多關於回調的內容見下文)。

您應該在擁有會話的活動或服務的onCreate()方法中建立和初始化一個媒體會話。github

爲了讓媒體按鈕在應用程序新初始化(或中止)時正常工做,其PlaybackState必須包含與媒體按鈕發送的意圖匹配的play操做。這就是爲何ACTION_PLAY在初始化期間被分配給會話狀態。有關更多信息,請參見對媒體按鈕的響應緩存

維護播放狀態和元數據

有兩個類表示媒體會話的狀態。bash

PlaybackStateCompat類描述了播放器的當前操做狀態。這包括:session

  • 傳輸狀態(播放器是否在玩/暫停/緩衝,等等。看getState())
  • 適用時的錯誤代碼和可選錯誤消息。(參見下面的getErrorCode()和讀取狀態和錯誤)
  • 播放器的位置
  • 能夠在當前狀態下處理的有效控制器操做

MediaMetadataCompat類描述正在播放的材料:app

  • 藝術家、專輯和歌曲的名字
  • 跟蹤持續時間
  • 相冊藝術品顯示在鎖屏上。圖像是一個最大大小爲320x320dp的位圖(若是較大,則按比例縮小)。
  • 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

除了控制播放器和管理媒體會話狀態轉換外,回調還啓用和禁用應用程序的特性,並控制它與其餘應用程序和設備硬件交互的方式。(參見控制音頻輸出)。

媒體會話回調方法的實現取決於應用程序的結構。請參閱分別描述如何在音頻應用程序視頻應用程序中使用回調的頁面,描述每種應用程序的回調應該如何實現。

相關文章
相關標籤/搜索