Android5.0 提出了全新的MediaSession概念用于播放器与控制器之间进行交互,它取代之前的RemoteControlClient,并提供了更为灵活的客户端受控端模型。

但是MediaSession框架只能在安卓5系统上使用,如何兼容低版本呢? Google在support-v4(21以上版本)中也提供了MediaSessionCompact兼容包。通过它可以告诉Android系统与其他的应用,自己正在播放的内容是什么以及自己支持哪些类型的播放控制。

在播放音乐时,通过MediaSessionCompat可以实现锁屏按键上的监听,从而转换成自己的操作。

官方文档
https://developer.android.com/reference/android/support/v4/media/session/MediaSessionCompat.html
本文介绍的是基于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() {@Overridepublic void onPlay() {AudioPlayer.get().playPause();}@Overridepublic void onPause() {AudioPlayer.get().playPause();}@Overridepublic void onSkipToNext() {AudioPlayer.get().next();}@Overridepublic void onSkipToPrevious() {AudioPlayer.get().prev();}@Overridepublic void onStop() {AudioPlayer.get().stopPlayer();}@Overridepublic void onSeekTo(long pos) {AudioPlayer.get().seekTo((int)pos);}};}

Android 原生锁屏页面音乐控制相关推荐

  1. android锁屏页面的实现

    android的锁屏页面有两种方法实现: 可参考:http://blog.csdn.net/yangxi_pekin/article/details/50456763 http://blog.csdn ...

  2. Android 小知识记录-----息屏后亮屏并显示Activity在锁屏页面之上

    息屏后亮屏并显示Activity在锁屏页面之上 1. 加权限 <uses-permission android:name="android.permission.WAKE_LOCK&q ...

  3. android锁屏快捷键设置,Android4.0+锁屏程序开发——设置锁屏页面篇

    [如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...

  4. Android 12.0 锁屏页面禁止下拉状态栏

    目录 1.概述 2.锁屏页面禁止下拉状态栏的核心类 3.锁屏页面禁止下拉状态栏的核心功能分析和实现

  5. Android 12.0 锁屏页面滑动解锁不灵敏的功能修复

    目录 1.概述 2.锁屏页面滑动解锁不灵敏的功能修复的核心类

  6. 浅谈 Android 自定义锁屏页的发车姿势

    作者:blowUp ,原文链接:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577446&idx=2&sn ...

  7. 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...

  8. 浅谈Android自定义锁屏页的发车姿势

    一.为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸 ...

  9. 【腾讯Bugly干货分享】浅谈 Android 自定义锁屏页的发车姿势

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...

最新文章

  1. mysql5.7 sql监控_MySQL5.7中 performance和sys schema中的监控参数解释
  2. Orders matters: seq2seq for set 实验
  3. Python中纠结处之其一—— 静态方法、类方法
  4. beyond compare如何添加新文件并重新比较?
  5. 五万块钱买什么车好_10万预算买什么车好?看空间、动力和配置
  6. python怎么用split字符串全部分开_python实现字符串完美拆分split()的方法
  7. Android 高效调试神器 JRebel
  8. 推荐一个谷歌浏览器去广告插件
  9. iOS-二级评论功能
  10. 【Python】base64解码报错 Incorrect padding
  11. 猫哥教你写爬虫 041--模拟登录-cookie
  12. Nacos的连接拒接丶解决方案
  13. 什么样的打码网站算正规的打码网站
  14. PWM 实现调光——测试pwn的功能
  15. 电视常用接口(TV,AV,S-Video,YCbCr/PCbCr,VGA,Scart,DVI/HDMI)
  16. 配置分布式集群方案要考虑哪些关键点?
  17. Python爬虫入门之爬虫解析提取数据的四种方法
  18. 国庆期间的景区舆情工作实施方案
  19. 计算机网络体系结构-移动IP
  20. 文件练习题(c语言)

热门文章

  1. 计算机毕业设计JAVA网上童装销售系统mybatis+源码+调试部署+系统+数据库+lw
  2. 天池比赛-02-用Apriori算法进行商品关联分析
  3. heic格式怎么改成jpg?
  4. 用计算机计算的定义,计算(数学用语)_百度百科
  5. LINUX NVME SSD 大容量存储设计
  6. RTMP直播推流(二)音频推流
  7. sql根据出生日期算年龄
  8. 交通锥,又称锥形路标、锥形筒、红帽子、方尖碑,是一种道路交通隔离警戒设施。
  9. android 黑白屏问题
  10. js实现复制图片到剪切板下载图片