Android 原生鎖屏頁面音樂控制

Android5.0 提出了全新的MediaSession概念用于播放器與控制器之間進(jìn)行交互,它取代之前的RemoteControlClient,并提供了更為靈活的客戶端受控端模型。

但是MediaSession框架只能在安卓5系統(tǒng)上使用,如何兼容低版本呢? Google在support-v4(21以上版本)中也提供了MediaSessionCompact兼容包。通過它可以告訴Android系統(tǒng)與其他的應(yīng)用,自己正在播放的內(nèi)容是什么以及自己支持哪些類型的播放控制。

在播放音樂時,通過MediaSessionCompat可以實(shí)現(xiàn)鎖屏按鍵上的監(jiān)聽,從而轉(zhuǎn)換成自己的操作。

官方文檔
https://developer.android.com/reference/android/support/v4/media/session/MediaSessionCompat.html

本文介紹的是基于MediaSessionCompat實(shí)現(xiàn)鎖屏界面進(jìn)行音樂播放控制功能

我們將MediaSessionCompat的初始化,控制,更新等操作都封裝到MediaSessionManager中,方便與播放器交互控制。

詳細(xì)步驟
1,初始化MediaSessionCompat實(shí)例


    //音樂的控制邏輯都在MusicPlayService服務(wù)中,將service實(shí)例傳遞過來,與MediaSessionManager進(jìn)行交互
    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());
            //設(shè)置監(jiān)聽回調(diào)
            mMediaSession.setCallback(sessionCb);
            //必須設(shè)置為true,這樣才能開始接收各種信息
            mMediaSession.setActive(true);
        } catch (Exception e) {
            LogTool.ex(e);
        }
    }

2,初始化回調(diào),用于監(jiān)聽鎖屏界面上的按鈕事件

    private MediaSessionCompat.Callback sessionCb = new MediaSessionCompat.Callback() {

        //鎖屏播放點(diǎn)擊事件
        @Override
        public void onPlay() {
            super.onPlay();
            //將事件傳遞給service處理
            musicPlayService.handleStartPlay();
        }

        //鎖屏?xí)和|c(diǎn)擊事件
        @Override
        public void onPause() {
            super.onPause();
            musicPlayService.handlePausePlay();
        }

        //鎖屏下一曲點(diǎn)擊事件
        @Override
        public void onSkipToNext() {
            super.onSkipToNext();
            musicPlayService.handleNextPlay();
        }

        //鎖屏上一曲點(diǎn)擊事件
        @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,點(diǎn)擊控制按鈕時,更新播放狀態(tài)

    public void updatePlaybackState(int currentState) {
        int state = (currentState == MusicPlayService.PLAY_STATE_PAUSED) ? PlaybackStateCompat.STATE_PAUSED : PlaybackStateCompat.STATE_PLAYING;
        //第三個參數(shù)必須為1,否則鎖屏上面顯示的時長會有問題
        stateBuilder.setState(state, musicPlayService.mMediaPlyer.getCurrentPosition(), 1.0f);
        mMediaSession.setPlaybackState(stateBuilder.build());
    }

MediaSessionManager設(shè)置完畢,只需要在MusicPlayService的onCreate中初始化MediaSessionManager,
在播放\暫停音樂的時候調(diào)用updatePlaybackState更新狀態(tài),更新歌曲的時候調(diào)用updateLocMsg更新信息即可。
需要注意的是,鎖屏上的信息需要在音樂播放時切換到鎖屏界面才會顯示,如果音樂暫停,切換到音樂播放界面是不會顯示的。

最終效果如下圖所示:


TIM截圖20180112104944.png

具體代碼已經(jīng)上傳至:https://github.com/Clearlee/LockScreenMusicControl

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容