最近遇到这么一个需求,就是在自己的应用中控制第三方播放器播放,以及获取正在播放的歌曲信息,包括名字,歌手,专辑,显示出来。一开始觉得很简单,但实际上遇到了不少的麻烦,最终实现了两种方案,读者可根据自己需要选择。
先讲如何控制第三方播放器播放的问题,可以使用RemoteControlService,里面有相关的方法,但究其原理,还是模拟耳机信号来控制。我们知道当耳机按下一曲时,无论是系统自带播放器还是第三方播放器都会做出相应的反应,所以这里我直接模拟发出耳机的keycode,就可以控制播放、暂停、上一曲、下一曲了,这个实现得比较轻松,代码如下:
public static void sendKeyEvent(final int KeyCode) {
new Thread() { //不可在主线程中调用
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
然后调用这个方法:
sendKeyEvent(85); //暂停
sendKeyEvent(87); //下一曲
sendKeyEvent(88); //上一曲
接着说如何获取正在播放的歌曲信息的问题,第一个方案是使用RemoteControlService,继承NotificationListenerService,实现RemoteController.OnClientUpdateListener接口,原理就是播放器在切换歌曲的时候,会给系统发一个Notification,告诉系统歌曲切换了,而其中就包含了歌曲的信息,可以拦截Notification来获取到里面的信息,但是有个弊端,你需要开启一个Service来监听,而且需要系统授权,这是最大的问题,如果用户不授权,你将无法获取信息,非常被动,但这个方法几乎能获取到所有第三方播放器的歌曲信息(酷狗不行,不知道为何,可能他发出的Notification里没有包含相关信息。而网易云我是监听不到Notification的,但却获取到了,非常奇怪)。代码如下:
import android.annotation.TargetApi;
import android.content.Intent;
import android.media.AudioManager;
import android.media.RemoteController;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.view.KeyEvent;
/**
* Created by wangzhaopeng on 2017/11/20.
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public class RemoteControlService extends NotificationListenerService implements RemoteController.OnClientUpdateListener {
public RemoteController rem