我想实现以下情况,以确定音乐是否正在Android手机上播放,如果是,则通过特定手势进行播放,

或单击一个按钮分享我当前正在听的音乐.

第一步是确定当前是否正在播放音乐.

一开始,我认为这有点复杂. 我以为我会更深入地研究框架或底层. 我发现了一些信息,并发现AudioManager公开了该接口.

isMusicActive()

通过此界面,您可以判断当前系统是否正在播放音乐.

还有另一个问题. 如果我想从头开始播放音乐时就知道此事件,则可以进行特殊处理.

进一步查看AudioManager的源代码,我们发现以下方法:

publicintrequestAudioFocus(OnAudioFocusChangeListenerl,intstreamType,intdurationHint)

从字面上看: 请求音频焦点,然后查看此函数的返回值:

/**

* A failed focus change request.*/

public static final int AUDIOFOCUS_REQUEST_FAILED = 0;/**

* A successful focus change request.*/

public static final int AUDIOFOCUS_REQUEST_GRANTED = 1;

管理音频焦点

多个应用程序正在播放音频的可能性,因此考虑应用程序如何交互非常重要. 为了避免同时播放每个音乐应用程序,Android使用音频焦点来协调仅具有音频焦点的音频播放应用程序才能播放音频.

在您的应用开始播放音频之前,它应该请求-并获得音频焦点. 同样,当检测到失去音频焦点时,它也应该知道如何合理响应.

这条路应该正确,编写以下测试代码进行验证. 这主要是Service的实现,还需要实现一个Activity以启动Service和结束Service:

public classMainService extends Service {private static final String TAG = "MainService";privateMediaPlayer player;privateAudioManager mAm;privateMyOnAudioFocusChangeListener mListener;

@Overridepublic voidonCreate() {

Log.i(TAG,"onCreate");

player= MediaPlayer.create(this, R.raw.test); //在res目录下新建raw目录,复制一个test.mp3文件到此目录下。

player.setLooping(false);

mAm=(AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

mListener= newMyOnAudioFocusChangeListener();

}

@OverridepublicIBinder onBind(Intent intent) {return null;

}

@Overridepublic void onStart(Intent intent, intstartid) {

Toast.makeText(this, "My Service Start", Toast.LENGTH_LONG).show();

Log.i(TAG,"onStart");//Request audio focus for playback

int result =mAm.requestAudioFocus(mListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);if (result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {

Log.i(TAG,"requestAudioFocus successfully.");//Start playback.

player.start();

}else{

Log.e(TAG,"requestAudioFocus failed.");

}

}

@Overridepublic voidonDestroy() {

Toast.makeText(this, "My Service Stoped", Toast.LENGTH_LONG).show();

Log.i(TAG,"onDestroy");

player.stop();

mAm.abandonAudioFocus(mListener);

}private classMyOnAudioFocusChangeListener implements OnAudioFocusChangeListener {

@Overridepublic void onAudioFocusChange(intfocusChange) {

Log.i(TAG,"focusChange=" +focusChange);

}

}

}

结合天天洞庭进行测试,首先打开天天洞庭播放音乐,然后启动此服务,发现天天洞庭自动暂停,然后停止此服务,天天洞庭再次开始播放.

依次,我首先启动此服务,然后每天播放和暂停“ Log.i(TAG识别电脑正在播放的歌曲,“ focusChange =” + focusChange);“. 这确实有一个输出日志.

主流音乐播放器都遵循此规则,因此通过使用Android机制,我们可以监视音乐的播放.

另一个问题,我怎么知道当前正在播放的音乐信息?两个想法:

1. 通过在后台自动截获音频流的输出,通过服务器收听歌曲和识别音乐;

2. 通过在SystemUI中拦截主流音乐播放器的通知;

第一个想法在原则上是可行的,但实现起来比较困难,并且严重依赖于网络;

让我们首先分析第二个想法.

首先找到一个主流的Android音乐播放器做一个简单的测试,例如: 天天洞庭,QQ音乐,酷狗音乐,酷我音乐,百度音乐等,在播放过程中,会向状态栏发送一条通知消息,其中已经包含歌曲信息. 然后,我只需要进行特殊的侦听并匹配程序包名称即可播放正在播放的音乐.

具体思路如下:

1. 实施服务. 启动Android手机时,此服务会自动运行. 音频焦点是通过AudioManager.requestAudioFocus()获得的,但是什么也没做. 仅当其他音乐播放器开始运行时. 通知消息;

2. 修改SystemUI,当主流音乐播放器向状态栏发送通知时,从中获取音乐信息;

3. 步骤1中的Listener可以集成到SystemUI中,以便当其他音乐播放器抢走音乐焦点时识别电脑正在播放的歌曲,结合最近收到的Notification通知,这会更准确;

这样,我们基本上可以实现所需的场景.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/ruanjian/article-270498-1.html

android 判断 音乐是否播放,Android如何判断当前手机是否正在播放音乐并获取有关正在播放的音乐的信息...相关推荐

  1. Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息

    我想实现如下的场景,判断当前Android手机上是否正在播放音乐,如果是,通过某个特定的手势, 或者点击某个按键,将当前我正在听的音乐共享出去. 第一步,就是判断当前是否有音乐正在播放. 最开始我想得 ...

  2. android 自动下一首,Android播播放完SD卡指定文件夹音乐之后,自动播放下一首

    最近做一个项目,需要连续播放音乐,播放完一首歌之后,自动播放完下一首歌.不要重复播放. 代码如下: package com.example.asyncplayer_ex; import java.io ...

  3. android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...

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

  4. android 多个绑定事件,Android RxJava 实际应用讲解:联合判断多个事件

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  5. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)

    在写这篇文章之前,xxx已写过了几篇关于改音乐应用开发主题的文章,想要了解的朋友可以去翻一下之前的文章 Android应用开发--MP3音乐播放器界面计划(2) 2013年5月25日 简.美音乐播放器 ...

  6. android判断多个按钮,Android开发之判断有无虚拟按键(导航栏)的实例

    判断有无虚拟按键(导航栏) 现在很大一部分手机没有虚拟按键,一部分有.我们在做适配的时候可能会用到这方面的知识. 例如:屏幕填充整个屏幕的时候,没办法只能连导航栏一起填充了,但是这个不是我们想要的,我 ...

  7. Android 监听网络连接状态,判断网络连接方式,9.0网络连接,获取已连接WiFi名称SSID和MAC

    获取已连接的WiFi名称 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> ...

  8. android 如何检查外部来源,Android是如何判断APK是否不明来源的

    1. 原生系统判断方法 http://blog.csdn.net/xidiankk/article/details/49533245 根据这个分析,必要条件有: 1) 发出intent的方式(启动Pa ...

  9. 基于百度音乐Api的Android高仿音乐播放App可在线试听下载歌词浏览

    基于百度音乐Api的Android高仿音乐播放App可在线试听下载歌词浏览 首先这也是学习过程中开发的一个练手项目,基于百度音乐Api,api在网上搜的,如果想看他的实现,可以下载我的项目来参考.风格 ...

最新文章

  1. IE开发人员工具之实用功能讲解
  2. android 隐藏webview地址栏,flutter - 在Flutter Webview中隐藏Url引用 - SO中文参考 - www.soinside.com...
  3. Python 调用 DLL
  4. en45545防火标准_揭秘:600岁故宫如何防火?
  5. .读取excel表格(JAVA)
  6. 一个易用、易部署的Python遗传算法库
  7. SuperMap IS.NET自定义Action添加Mark
  8. 值得看的hadoop书籍
  9. 处理兼容问题:对于某些css3属性需要加前缀?
  10. Anaconda中安装pygame
  11. 成人高考计算机基础历年真题,成人高考历年真题及答案
  12. 【文本识别】CRNN
  13. 中国通信简史 (上)
  14. Matlab 工作区变量和 MAT 文件
  15. 基于DCT变换的JPEG图像压缩原理
  16. matlab里逻辑符号,下列符号中不属于MATLAB逻辑操作符的是()
  17. 如何给PDF文件添加水印?PDF免费添加水印教程来了
  18. 妥妥的世界第一:为什么MT4软件的地位无法撼动?
  19. 小鸟伏特加怎么用计算机,小鸟伏特加什么意思
  20. Okidoki - Alpha阶段项目展示 - TEAM LESS ERROR

热门文章

  1. Ping计算机名和Ping网站域名都是由DNS解析吗?
  2. QQ音乐酷狗音乐竞品分析
  3. [ECE]模拟试题-6
  4. 写接口给京东使用的过程中学到的学习方法
  5. 移动宽带连接电信服务器不稳定,移动宽带速度为啥与电信差距那么大?工信部官宣告诉你...
  6. 电源设计中的电容应用实例
  7. R shiny echart4r 常见问题整理
  8. 简易的不科学立直麻将学习笔记(1)-进攻策略-门清编-简单的两面听向做牌指南...
  9. 错误 bpbrm(PID=7552) 从客户端 - Script exited with status = 1 the requested operat
  10. 天嵌科技恭祝大家元宵节快乐