MediaSession是一个媒体控制类,通过与媒体应用的交互,可以实现对媒体应用的控制。
现在广泛应用到对媒体控制的场景,例如耳机,蓝牙设备,VR等。
MediaSession的好处
可以通过MediaSession就可以对media应用进行控制,无需打开应用本身。也是aosp中支持的媒体应用的控制与管理框架,无需单独适配各种控制场景。从而提供了流畅的用户体验。
与通知栏配合使用,可以在通知栏实时看到当前播放的媒体信息,并且可以在通知栏中进行对媒体操作,播放、暂停、上一曲、下一曲等。方便用户操作,无需每次都打开应用。
总之MediaSession可以提供完美的用户体验。
MediaSession的简单使用
使用的类说明
MediaBrowser:媒体浏览器。连接服务,并获取token。
MediaController:媒体控制类。可以获取媒体信息,对媒体应用发送控制指令
MediaBrowserService:浏览器服务,实现具体的媒体控制逻辑。
MediaSession:接收客户端指令,并将媒体信息发送到客户端。
上代码!!!
客户端:
class MainActivity : AppCompatActivity() {
private lateinit var mMediaBrowser: MediaBrowser
private lateinit var mMediaController: MediaController
private var mMediaCallback = object : MediaController.Callback() {
override fun onMetadataChanged(metadata: MediaMetadata?) {
super.onMetadataChanged(metadata)
var description = metadata?.description
var title = description?.title
var author = description?.subtitle
var album = description?.description
var totalTime = metadata?.getLong(MediaMetadata.METADATA_KEY_DURATION)
...
}
override fun onPlaybackStateChanged(state: PlaybackState?) {
super.onPlaybackStateChanged(state)
var playState = state?.state
when (playState) {
PlaybackState.STATE_PLAYING -> {
}
}
//当前播放位置
var position = state?.position
}
override fun onSessionEvent(event: String, extras: Bundle?) {
super.onSessionEvent(event, extras)
}
override fun onAudioInfoChanged(info: MediaController.PlaybackInfo?) {
super.onAudioInfoChanged(info)
}
}
private var mConnectionCallback = object : MediaBrowser.ConnectionCallback() {
override fun onConnected() {
super.onConnected()
var token = mMediaBrowser.sessionToken;
mMediaController = MediaController(applicationContext, token)
mMediaController.registerCallback(mMediaCallback)
// mMediaController.unregisterCallback(mMediaCallback)
}
override fun onConnectionSuspended() {
super.onConnectionSuspended()
}
override fun onConnectionFailed() {
super.onConnectionFailed()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mMediaBrowser = MediaBrowser(
this, ComponentName(this, TargetService::class.java),
mConnectionCallback, null
)
mMediaBrowser.connect()
...
mMediaController.transportControls.play()
var bundle = Bundle()
bundle.putString("play", "yes")
mMediaController.transportControls.sendCustomAction("", bundle)
val metadata = mMediaController.metadata
val playbackState = mMediaController.playbackState
...
}
}
服务端:
class TargetService : MediaBrowserService() {
private lateinit var mMediaSession:MediaSession
private var mCallback = object : MediaSession.Callback() {
override fun onPlay() {
super.onPlay()
...
mMediaSession.setPlaybackState(playbackState)
}
override fun onPause() {
super.onPause()
...
}
override fun onSeekTo(pos: Long) {
super.onSeekTo(pos)
...
}
override fun onSkipToNext() {
super.onSkipToNext()
...
}
override fun onCustomAction(action: String, extras: Bundle?) {
super.onCustomAction(action, extras)
...
}
}
override fun onCreate() {
super.onCreate()
mMediaSession = MediaSession(this,"TargetService")
sessionToken = mMediaSession.sessionToken
mMediaSession.setCallback(mCallback)
}
override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot? {
...
return BrowserRoot("rootId", null)
}
override fun onLoadChildren(parentId: String, result: Result<MutableList<MediaBrowser.MediaItem>>) {
...
TODO("Not yet implemented")
}
}
就此,大功告成,快去试试吧。