Android实现原生锁屏页面音乐控制
程序员文章站
2022-03-31 14:08:08
android5.0 提出了全新的mediasession概念用于播放器与控制器之间进行交互,它取代之前的remotecontrolclient,并提供了更为灵活的客户端受控端模型。...
android5.0 提出了全新的mediasession概念用于播放器与控制器之间进行交互,它取代之前的remotecontrolclient,并提供了更为灵活的客户端受控端模型。
但是mediasession框架只能在安卓5系统上使用,如何兼容低版本呢? google在support-v4(21以上版本)中也提供了mediasessioncompact兼容包。通过它可以告诉android系统与其他的应用,自己正在播放的内容是什么以及自己支持哪些类型的播放控制。
在播放音乐时,通过mediasessioncompat可以实现锁屏按键上的监听,从而转换成自己的操作。
本文介绍的是基于mediasessioncompat实现锁屏界面进行音乐播放控制功能
package com.yobbom.jiheboxplayer.service; 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.yobbom.jiheboxplayer.model.music; /** * created by administrator on 2019/4/3. */ public class mediasessionmanager { private static final string tag = "mediasessionmanager"; private static final long media_session_actions = playbackstatecompat.action_play | playbackstatecompat.action_pause | playbackstatecompat.action_play_pause | playbackstatecompat.action_skip_to_next | playbackstatecompat.action_skip_to_previous | playbackstatecompat.action_stop | playbackstatecompat.action_seek_to; private playservice playservice; private mediasessioncompat mediasession; public static mediasessionmanager get(){ return singletonholder.instance; } private static class singletonholder{ private static mediasessionmanager instance = new mediasessionmanager(); } private mediasessionmanager(){ } //音乐的控制逻辑都在playservice服务中,将service实例传递过来,与mediasessionmanager进行交互 private void init(playservice playservice){ this.playservice = playservice; setupmediasession(); } private void setupmediasession(){ mediasession = new mediasessioncompat(playservice, tag); //指明支持的按键信息类型 mediasession.setflags(mediasessioncompat.flag_handles_transport_controls | mediasessioncompat.flag_handles_media_buttons); mediasession.setcallback(callback);//设置监听回调 mediasession.setactive(true);//必须设置为true,这样才能开始接收各种信息 } //点击控制按钮时,更新播放状态 public void updateplaybackstate(){ int state = (audioplayer.get().isplaying() || audioplayer.get().ispreparing()) ? playbackstatecompat.state_playing : playbackstatecompat.state_paused; //第三个参数必须为1,否则锁屏上面显示的时长会有问题 mediasession.setplaybackstate( //监听的事件(播放,暂停,上一曲,下一曲) new playbackstatecompat.builder() .setactions(media_session_actions) .setstate(state, audioplayer.get().getaudioposition(), 1) .build()); } //播放歌曲时,需要更新屏幕上的歌曲信息 public void updatemetadata(music music){ if(music == null){ mediasession.setmetadata(null); return; } //log.d(tag, "parsemp3file名称: " + mmr.extractmetadata(mediametadataretriever.metadata_key_title)); //log.d(tag, "parsemp3file专辑: " + mmr.extractmetadata(mediametadataretriever.metadata_key_album)); //log.d(tag, "parsemp3file歌手: " + mmr.extractmetadata(mediametadataretriever.metadata_key_artist)); //log.d(tag, "parsemp3file码率: " + mmr.extractmetadata(mediametadataretriever.metadata_key_bitrate)); //log.d(tag, "parsemp3file时长: " + mmr.extractmetadata(mediametadataretriever.metadata_key_duration)); //log.d(tag, "parsemp3file类型: " + mmr.extractmetadata(mediametadataretriever.metadata_key_mimetype)); mediametadatacompat.builder metadata = new mediametadatacompat.builder() .putstring(mediametadatacompat.metadata_key_title, music.gettitle()) .putstring(mediametadatacompat.metadata_key_artist, music.getartist()) .putstring(mediametadatacompat.metadata_key_album, music.getalbum()) .putstring(mediametadatacompat.metadata_key_album_artist, music.getartist()) .putlong(mediametadatacompat.metadata_key_duration, music.getduration()) .putbitmap(mediametadatacompat.metadata_key_album_art, coverloader.get().loadthumb(music)); if(build.version.sdk_int >= build.version_codes.lollipop){ metadata.putlong(mediametadatacompat.metadata_key_num_tracks, appcache.get().getlocalmusiclist().size()); } mediasession.setmetadata(metadata.build()); } //初始化回调,用于监听锁屏界面上的按钮事件 private mediasessioncompat.callback callback = new mediasessioncompat.callback() { @override public void onplay() { audioplayer.get().playpause(); } @override public void onpause() { audioplayer.get().playpause(); } @override public void onskiptonext() { audioplayer.get().next(); } @override public void onskiptoprevious() { audioplayer.get().prev(); } @override public void onstop() { audioplayer.get().stopplayer(); } @override public void onseekto(long pos) { audioplayer.get().seekto((int)pos); } }; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Android自定义控件实现时钟效果