前一天實作了 MediaBrowserService,裡面還有 MediaSession 需要加入,接著來看一下怎麼設定 MediaSession 吧。MediaSession 為 Player 的代理人,設定初始化的行為(),並接收 callback(ex: onPlay、onPause...... 等),接著就可以呼叫 Player 有對應的行為。
這邊會分為兩天來介紹,今天會先介紹官方文件上的寫法,明天介紹 uamp 專案內的實作,因為專案內使用了 ExoPlayer ,ExoPlayer 有提供一些方便的 extension,能讓開發者能少寫一些樣板程式碼,因此比起官方文件上的介紹會比較簡潔。
先看官方文件的介紹:
// Create a MediaSessionCompat
mediaSession = MediaSessionCompat(baseContext, LOG_TAG).apply {
// Enable callbacks from MediaButtons and TransportControls
setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)
// Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
stateBuilder = PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PLAY_PAUSE
)
setPlaybackState(stateBuilder.build())
// MySessionCallback() has methods that handle callbacks from a media controller
setCallback(MySessionCallback())
// Set the session's token so that client activities can communicate with it.
setSessionToken(sessionToken)
}
setFlags 這兩個參數都已經 Deprecated 了,文件可能還沒更新 XD,都變成了預設的設定,都會接收。 MEDIA_BUTTONS 舉例來說:藍芽耳機操控事件,TRANSPORT_CONTROLS 是 MediaController 來的事件。
setPlaybackState: 設定初始的播放狀態
setCallback: 設定收到 callback 後要執行什麼對應的行為,callback 為 MediaSessionCompat.Callback,裡面有很多的 callback,ex: onPlay(),在之後會介紹到的 MediaController 呼叫 play 時,onPlay 就會被呼叫到,這時候 Player 就需要執行播放功能。
找到一個解說示意圖,搭配著看會比較清楚:
Ref: Android:MediaSession框架介紹