在最近的项目中,遇到了一个在手机与pc端连接蓝牙播放音乐时,需要将手机播放的信息跟pc同步。
后面自己查了一些文档,发现实现此需求跟 RemoteControlClient 类有直接关系。
RemoteControlClient是从API 14也就是android 4.0开始出现的类,用于在锁屏状态控制音乐播放。界面是系统提供的。
在api doc文档上附了一段注册代码
ComponentName myEventReceiver = new ComponentName(getPackageName(), MyRemoteControlEventReceiver.class.getName()); AudioManager myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); myAudioManager.registerMediaButtonEventReceiver(myEventReceiver); // build the PendingIntent for the remote control client Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(myEventReceiver); PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0); // create and register the remote control client RemoteControlClient myRemoteControlClient = new RemoteControlClient(mediaPendingIntent); myAudioManager.registerRemoteControlClient(myRemoteControlClient);
上面的代码开始时注册了耳机按键的事件,接着注册了RemoteControlClient。
要想弄出RemoteControlClient的界面,上面的代码还不够,还需要把当前音乐状态设置为正在播放。
当然设置了 这些还不够,必须获取音频焦点,最好是在服务中获取,下面是请求音频焦点的代码:
am.requestAudioFocus(new OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
System.out.println("focusChange = " + focusChange);
}
}, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
这样,在锁屏状态系统界面就能出现了,默认只有一个播放暂停按钮。要想显示额外的信息,使用editMetadata(boolean startEmpty)去put,如果想多显示几个控制按钮,如下:
int flags = RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS
| RemoteControlClient.FLAG_KEY_MEDIA_NEXT
| RemoteControlClient.FLAG_KEY_MEDIA_PLAY
| RemoteControlClient.FLAG_KEY_MEDIA_PAUSE
| RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE 点击查看api
| RemoteControlClient.FLAG_KEY_MEDIA_STOP;
mClient.setTransportControlFlags(flags);
当然此锁屏方式可能在某些机型上无法实现,这是因为出厂商可能在设备上做出了修改,或者是api过时所导致的。在最新的官方文档上可以看到推荐使用 MediaSession 地址是: https://developer.android.com/reference/android/media/session/MediaSession.html.
实际上音频开发蓝牙与PC端连接同步与系统锁屏是基于同一个RemoteControlClient远程控制类实现,到此需求完成。。。。