package com.ydl.media.audio.manager import android.graphics.Bitmap import android.os.Build import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat import com.ydl.media.audio.AudioPlayer import com.ydl.media.audio.PlayService import com.ydl.media.audio.model.Music import com.ydl.media.audio.utils.CoverImageUtils /** * Created by haorui on 2019-10-27 . * Des: */ class MediaSessionManager private constructor() { private var playService: PlayService? = null private var mediaSession: MediaSessionCompat? = null private val callback = object : MediaSessionCompat.Callback() { override fun onPlay() { AudioPlayer.get().playPause() } override fun onPause() { AudioPlayer.get().playPause() } override fun onSkipToNext() { AudioPlayer.get().next() } override fun onSkipToPrevious() { AudioPlayer.get().prev() } override fun onStop() { AudioPlayer.get().stopPlayer() } override fun onSeekTo(pos: Long) { AudioPlayer.get().seekTo(pos.toInt()) } } private object SingletonHolder { val instance = MediaSessionManager() } fun init(playService: PlayService) { this.playService = playService setupMediaSession() } private fun setupMediaSession() { mediaSession = MediaSessionCompat(playService!!, TAG) mediaSession!!.setFlags(MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS or MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS) mediaSession!!.setCallback(callback) mediaSession!!.isActive = true } fun updatePlaybackState() { val state = if (AudioPlayer.get().isPlaying || AudioPlayer.get().isPreparing) PlaybackStateCompat.STATE_PLAYING else PlaybackStateCompat.STATE_PAUSED mediaSession!!.setPlaybackState( PlaybackStateCompat.Builder() .setActions(MEDIA_SESSION_ACTIONS) .setState(state, AudioPlayer.get().audioPosition, 1f) .build() ) } fun updateMetaData(music: Music?) { if (music == null) { mediaSession!!.setMetadata(null) return } CoverImageUtils.loadThumb(music.coverPath!!,object :CoverImageUtils.OnCoverLoadListener{ override fun onComplete(bitmap: Bitmap) { val metaData = MediaMetadataCompat.Builder() .putString(MediaMetadataCompat.METADATA_KEY_TITLE, music.title) .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, music.artist) .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, music.album) .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, music.artist) .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, music.duration) .putBitmap( MediaMetadataCompat.METADATA_KEY_ALBUM_ART,bitmap ) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // TODO: 2019-10-26 by:HaoRui // metaData.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, AppCache.get().getLocalMusicList().size()); } mediaSession!!.setMetadata(metaData.build()) } }) } companion object { private val TAG = "MediaSessionManager" private val MEDIA_SESSION_ACTIONS = (PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PAUSE or PlaybackStateCompat.ACTION_PLAY_PAUSE or PlaybackStateCompat.ACTION_SKIP_TO_NEXT or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or PlaybackStateCompat.ACTION_STOP or PlaybackStateCompat.ACTION_SEEK_TO) fun get(): MediaSessionManager { return SingletonHolder.instance } } }