
我想实现以下情况,以确定音乐是否正在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 class MainService extends Service { private static final String TAG = "MainService"; private MediaPlayer player; private AudioManager mAm; private MyOnAudioFocusChangeListener mListener; @Override public void onCreate() { 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 = new MyOnAudioFocusChangeListener(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onStart(Intent intent, int startid) { 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."); } } @Override public void onDestroy() { Toast.makeText(this, "My Service Stoped", Toast.LENGTH_LONG).show(); Log.i(TAG, "onDestroy"); player.stop(); mAm.abandonAudioFocus(mListener); } private class MyOnAudioFocusChangeListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { 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
没有激烈冲突
我很信赖南方黑芝麻湖
那里的岛礁有许多在自然状况下是当涨潮时处于海面以下的