Android5.0 提出了全新的MediaSession概念用于播放器與控制器之間進行交互券坞,它取代之前的RemoteControlClient鬓催,并提供了更為靈活的客戶端受控端模型。
但是MediaSession框架只能在安卓5系統(tǒng)上使用恨锚,如何兼容低版本呢? Google在support-v4(21以上版本)中也提供了MediaSessionCompact兼容包宇驾。通過它可以告訴Android系統(tǒng)與其他的應用,自己正在播放的內容是什么以及自己支持哪些類型的播放控制猴伶。
在播放音樂時课舍,通過MediaSessionCompat可以實現鎖屏按鍵上的監(jiān)聽,從而轉換成自己的操作他挎。
官方文檔
https://developer.android.com/reference/android/support/v4/media/session/MediaSessionCompat.html
本文介紹的是基于MediaSessionCompat實現鎖屏界面進行音樂播放控制功能
我們將MediaSessionCompat的初始化筝尾,控制,更新等操作都封裝到MediaSessionManager中办桨,方便與播放器交互控制筹淫。
詳細步驟
1,初始化MediaSessionCompat實例
//音樂的控制邏輯都在MusicPlayService服務中,將service實例傳遞過來呢撞,與MediaSessionManager進行交互
public MediaSessionManager(MusicPlayService service) {
this.musicPlayService = service;
initSession();
}
public void initSession() {
try {
mMediaSession = new MediaSessionCompat(musicPlayService, MY_MEDIA_ROOT_ID);
//指明支持的按鍵信息類型
mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
//監(jiān)聽的事件(播放损姜,暫停,上一曲殊霞,下一曲)
stateBuilder = new PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE
| PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS);
mMediaSession.setPlaybackState(stateBuilder.build());
//設置監(jiān)聽回調
mMediaSession.setCallback(sessionCb);
//必須設置為true摧阅,這樣才能開始接收各種信息
mMediaSession.setActive(true);
} catch (Exception e) {
LogTool.ex(e);
}
}
2,初始化回調,用于監(jiān)聽鎖屏界面上的按鈕事件
private MediaSessionCompat.Callback sessionCb = new MediaSessionCompat.Callback() {
//鎖屏播放點擊事件
@Override
public void onPlay() {
super.onPlay();
//將事件傳遞給service處理
musicPlayService.handleStartPlay();
}
//鎖屏暫停點擊事件
@Override
public void onPause() {
super.onPause();
musicPlayService.handlePausePlay();
}
//鎖屏下一曲點擊事件
@Override
public void onSkipToNext() {
super.onSkipToNext();
musicPlayService.handleNextPlay();
}
//鎖屏上一曲點擊事件
@Override
public void onSkipToPrevious() {
super.onSkipToPrevious();
musicPlayService.handlePrePlay();
}
};
3,播放歌曲時绷蹲,需要更新屏幕上的歌曲信息
public void updateLocMsg() {
try {
//同步歌曲信息
MediaMetadataCompat.Builder md = new MediaMetadataCompat.Builder();
//歌曲名
md.putString(MediaMetadataCompat.METADATA_KEY_TITLE, MusicUtil.getInstance().getCurrPlayMusicInfo().getName());
//歌手名
md.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, MusicUtil.getInstance().getCurrPlayMusicInfo().getAuthor());
//專輯名
md.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, MusicUtil.getInstance().getCurrPlayMusicInfo().getAlbum());
//歌曲時長
md.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, MusicUtil.getInstance().getCurrPlayMusicInfo().getDuration());
mMediaSession.setMetadata(md.build());
} catch (Exception e) {
LogTool.ex(e);
}
}
4,點擊控制按鈕時棒卷,更新播放狀態(tài)
public void updatePlaybackState(int currentState) {
int state = (currentState == MusicPlayService.PLAY_STATE_PAUSED) ? PlaybackStateCompat.STATE_PAUSED : PlaybackStateCompat.STATE_PLAYING;
//第三個參數必須為1,否則鎖屏上面顯示的時長會有問題
stateBuilder.setState(state, musicPlayService.mMediaPlyer.getCurrentPosition(), 1.0f);
mMediaSession.setPlaybackState(stateBuilder.build());
}
MediaSessionManager設置完畢祝钢,只需要在MusicPlayService的onCreate中初始化MediaSessionManager比规,
在播放\暫停音樂的時候調用updatePlaybackState更新狀態(tài),更新歌曲的時候調用updateLocMsg更新信息即可拦英。
需要注意的是苞俘,鎖屏上的信息需要在音樂播放時切換到鎖屏界面才會顯示,如果音樂暫停龄章,切換到音樂播放界面是不會顯示的吃谣。
最終效果如下圖所示:
具體代碼已經上傳至:https://github.com/Clearlee/LockScreenMusicControl