项目场景:

最近在做穿戴项目时,需要针对第三方播放进行控制,如:播放、暂停、上一曲、下一曲等


问题描述

在百度上发现现在大都是通过AudioManager控制

/*** 播放 暂停*/public void playMusicLocal() {KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);((AudioManager) getSystemService(Context.AUDIO_SERVICE)).dispatchMediaKeyEvent(downEvent);((AudioManager) getSystemService(Context.AUDIO_SERVICE)).dispatchMediaKeyEvent(upEvent);}/*** 下一曲*/public void nextMusicLocal() {KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT);KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT);((AudioManager) getSystemService(Context.AUDIO_SERVICE)).dispatchMediaKeyEvent(downEvent);((AudioManager) getSystemService(Context.AUDIO_SERVICE)).dispatchMediaKeyEvent(upEvent);}/*** 上一曲*/public void lastMusic() {KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS);KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS);((AudioManager) getSystemService(Context.AUDIO_SERVICE)).dispatchMediaKeyEvent(downEvent);((AudioManager) getSystemService(Context.AUDIO_SERVICE)).dispatchMediaKeyEvent(upEvent);}

实际使用发现 在多播放器下使用时,容易出现无法控制播放器现象


原因分析:

AudioManager其实也是通过模拟触摸的形式去控制播放器,但是在多播放器下,可能出现焦点被占据导致无法响应,当然也不排除一些特殊情况下 播放器无法响应该触摸事件


解决方案:

由于每个播放器在播放时候时候 都会在通知页面构造当前播放信息以及包含部分操作按钮等,所以想着通过NotificationListenerService 在该服务中 监听通知控制。

打开音乐播放器后

通过NotificationListenerService 监听当前通知信息如图

在这里,我们主要关注notification字段,展开notification后 如图:

 展开extras字段后 如图:

在这里我们主要通过 android.mediaSession字段 读取该字段会返回MediaSession.Token对象,通过该对象我们就可以实例化MediaController去控制该播放器

MediaSession.Token token = bundle.getParcelable(Notification.EXTRA_MEDIA_SESSION);
MediaController mediaController = new MediaController(this, token);
mediaController.getTransportControls().play(); //播放
mediaController.getTransportControls().pause(); //暂停
mediaController.getTransportControls().skipToNext();//下一曲
mediaController.getTransportControls().skipToPrevious();//上一曲

在多播放器时,我们一般处理的是最后使用过的播放器,这里需要针对获取到的通知对象数据进行排序

StatusBarNotification[] sbns = getActiveNotifications();
Arrays.sort(sbns, new MyComparator());
//针对通知 进行时间排序
class MyComparator implements Comparator<StatusBarNotification> {@Overridepublic int compare(StatusBarNotification o1, StatusBarNotification o2) {if (o1.getPostTime() > o2.getPostTime()) {return -1;} else if (o1.getPostTime() < o2.getPostTime()) {return 1;}return 0;}
}

排序完成之后 我们就可以获取当前正在播放的音乐通知了

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {return null;
}
StatusBarNotification[] sbns = getActiveNotifications();
Arrays.sort(sbns, new MyComparator());
for (StatusBarNotification sbn : sbns) {Notification notification = sbn.getNotification();if (null == notification) {continue;}Bundle bundle = notification.extras;if (null == bundle) {continue;}MediaSession.Token token = bundle.getParcelable(Notification.EXTRA_MEDIA_SESSION);if (null == token) {continue;}try {MediaController mediaController = new MediaController(this, token);return mediaController;} catch (Exception ex) {return null;}
}

在这里实例化MediaController对象后 就可以对播放器进行控制了,当然还可以获取一些当前的播放器基本信息等。

有一点比较坑的是,在部分厂商上是无法获取到的 例如华为。

Android 控制第三方音乐播放器相关推荐

  1. Android实现控制第三方音乐播放器暂停/播放

    实现控制第三方音乐播放器思路: 1.参考方法:可能实现第三方音乐播放器暂停/播放/下一曲/上一曲 思路:android模拟发送键值,就像蓝牙耳机等远程设备切换歌曲操作,但是行不通.原因是现在Andro ...

  2. Android怎样实现控制第三方音乐播放器暂停、播放

    1.需求 怎么控制第三方音乐播放器暂停 播放呢 2.解决思路 写一个服务,当第三方播放器打开时 ,开启这个服务,音乐暂停:关闭服务,音乐继续 3.开启和关闭服务 startService(new In ...

  3. Android获取第三方音乐播放器的音乐信息

    最近在做Android手机获取第三方音乐播放器的音乐信息.一开始头疼的很,采集第三方的信息太难了,后面看了一遍博文是关于怎么监听系统的音乐播放信息,发现在播放下一首音乐的时候会发送广播,广播会包含下一 ...

  4. [内附完整源码和文档] 基于Android的手机音乐播放器的设计与实现

    摘 要 随着Android系统和移动互联网的快速崛起,手机已经成为人们生活不可缺的一部分,在现代人的生活中,人们生活节奏的加快,生活压力越来越大,碎片化的时间越来越多,那么一个可以在碎片化的时间内调节 ...

  5. Android Studio简易音乐播放器设计作业

    Android Studio简易音乐播放器设计作业 实验成功展示 实验代码 MainActivity.java XML文件 class文件 利用BroadcastReceiver模拟音乐播放器,实现播 ...

  6. 基于Android的手机音乐播放器的设计与实现

    源码及论文下载:http://www.byamd.xyz/tag/android/ 摘 要 随着Android系统和移动互联网的快速崛起,手机已经成为人们生活不可缺的一部分,在现代人的生活中,人们生活 ...

  7. android音乐播放器 毕业论文,毕业论文-- 基于Android系统的音乐播放器的实现 .doc...

    毕业论文-- 基于Android系统的音乐播放器的实现 .doc 还剩 31页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! ...

  8. 基于android的网络音乐播放器-网络音乐的多线程下载(六)

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

  9. android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

    Android MediaPlayer实现音乐播放器 1.布局文件 android:layout_width="fill_parent" android:layout_height ...

最新文章

  1. 深入浅出python系列(一)包与模块
  2. java issynthetic_java.lang.reflect.Constructor.isSynthetic()方法示例
  3. linux iopen i2c dev,i2c-dev - Linux驱动子系统之I2C_Linux编程_Linux公社-Linux系统门户网站...
  4. 社交网络初探——链路预测
  5. c语言借阅管理题目内容描述,C语言 图书借阅管理统 第四组.doc
  6. 理解*arg 、**kwargs
  7. POJ 1166 The Clocks
  8. XNA Game Studio 2.0安装问题,崩溃了
  9. Java实现 蓝桥杯 算法提高 日期计算
  10. 数据仓库-hive分区表
  11. [笔记] 关于通过鼠标滚轮设置缩放的技巧
  12. 使用DHT11和51单片机进行温湿度的读取(保证好用版本)
  13. WiFi认证过程需要的协议和服务
  14. vbs介绍与常见整人代码
  15. 我的世界java局域网存档位置_网易版我的世界局域网联机存档怎么转移 如何将局域网存档转到租赁服...
  16. 亿赛通携手湖北省勘察设计协会 共建数据安全
  17. 【雯女遭TVB封杀没剧拍】
  18. 基于angular.js的全年日历作物操作甘特图
  19. Linux命令-查看CPU型号,内存大小,硬盘空间
  20. IDEA 如何进行分屏显示代码

热门文章

  1. GameofMir引擎架设传奇服务器【3:在服务器上架设引擎】
  2. mysql gprs 程序_基于STM32控制的GPS定位与GPRS发送数据(程序源码)
  3. SpringBoot启动报错:Failed to introspect Class [XXX] from ClassLoader
  4. DockerSwarm部署服务一直处于preparing
  5. 人工智能时代对会计行业的改变与反思
  6. Rosalind Java| Counting Point Mutations
  7. 微信相关账号需要哪些资质
  8. HMS-广告服务(Banner广告)
  9. 基于英雄大作战龙奥的Unity骨骼动画初探
  10. 计算机锁屏打不开,电脑快捷锁屏不能用怎么办