iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Mobile Development

Android 音樂播放器自己來系列 第 9

播放器架構實作 (2) - MediaSession 觀念介紹

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20200909/201297288yJo4kmBLP.png
前一天實作了 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 就需要執行播放功能。

找到一個解說示意圖,搭配著看會比較清楚:
https://ithelp.ithome.com.tw/upload/images/20200909/20129728zXPIM5IjZp.png
Ref: Android:MediaSession框架介紹

  • setSessionToken:在第一天的介紹有提過播放結構的概念為 Client / Server,因此可以有很多個 Client 來控制一個 Server,在 Client 取得前一天介紹的 MediaBrowserService 的 BrowserRoot 後,就可以拿到設定的 SessionToken 進而來初始化 MediaController,這樣完成連接後,就可以透過 MediaController 控制 Player 了,細部的設定再後幾天會詳細說明。

上一篇
播放器架構實作 (1) - MediaBrowseService 實作
下一篇
播放器架構實作 (3) - MediaSession 實作
系列文
Android 音樂播放器自己來30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言