MediaSession这种媒体框架由MediaBrowser(媒体浏览器)和MediaBrowserService(媒体浏览器服务)两部分组成。主要作用是规范了媒体服务和界面的通信接口,达到了完全解耦,可以自由、高效进行不同的媒体的切换。
一、基础用法
首先,我们先来看一下MediaSession主要类和对象的构成,如下图:
这个图只是用来对整个框架进行梳理和回顾,相信在看完后面的使用方法后就会觉得很简单了。
简单描述一下:
- MediaBrowser:媒体浏览器,用来连接服务,在连接成功的结果回调后,获取token(配对令牌),并以此获得MediaController媒体控制器。同时,有订阅并设置订阅信息回调的功能。
- MediaController:媒体控制器,可以用
mMediaController.getMetadata()
等方法来主动获取媒体信息,也可以使用形如mMediaController.getTransportControls().skipToNext()
来发送控制指令。其次一般需要注册MediaController.Callback回调进行客户端更新。 - MediaBrowserService:浏览器服务,实现具体的媒体逻辑。一般在oncrete()中用
setSessionToken(...)
来设置token。在重写的onGetRoot(…)中判断是否允许连接,在onLoadChildren(…)中处理订阅信息。 - MediaSeesion:设置MediaSeesion.Callback,这里就是客户端指令送达的地方。在媒体信息或状态改变后,使用形如
mediaSession.setMetadata(mediaMetadata)
来通知客户端。
下面是具体的使用:
1.连接,并建立联系
先来看客户端,我们需要做的是建立连接,并且在连接成功后设置回调。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
//媒体浏览器
private MediaBrowser mMediaBrowser;
//媒体控制器
private MediaController mMediaController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//新建MediaBrowser,第一个参数是context
//第二个参数是CompoentName,有多种构造方法,指向要连接的服务
//第三个参数是连接结果的回调connectionCallback,第四个参数为Bundle
mMediaBrowser = new MediaBrowser(this,
new ComponentName(this, MediaService.class), connectionCallback, null);
mMediaBrowser.connect();
...
}
//连接结果的回调
private MediaBrowser.ConnectionCallback connectionCallback
= new MediaBrowser.ConnectionCallback() {
public void onConnected() {
//如果服务端接受连接,就会调此方法表示连接成功,否则回调onConnectionFailed();
Log.d(TAG, "onConnected: ");
//获取配对令牌
MediaSession.Token token = mMediaBrowser.getSessionToken();
//通过token,获取MediaController,第一个参数是context,第二个参数为token
mMediaController = new MediaController(getBaseContext(), token);
//mediaController注册回调,callback就是媒体信息改变后,服务给客户端的回调
mMediaController.registerCallback(mMediaCallBack);
}
public void onConnectionSuspended() {
//与服务断开回调(可选)
}
public void onConnectionFailed() {
//连接失败回调(可选)
}
}
//服务对客户端的信息回调。
private MediaController.Callback mMediaCallBack = new MediaController.Callback() {
//回调函数的方法都是选择性重写的,这里不列举全,具体可查询文章末尾的表格
@Override
public void onMetadataChanged(MediaMetadata metadata) {
super.onMetadataChanged(metadata);
//服务端运行mediaSession.setMetadata(mediaMetadata)就会到达此处,以下类推.
//歌曲信息回调,更新。MediaMetadata在文章后面会提及
MediaDescription description = metadata.getDescription();
//获取标题
String title = description.getTitle().toString();
//获取作者
String author = description.getSubtitle().toString();
//获取专辑名
String album = description.getDescription().toString();
//获取总时长
long duratime = mediaMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
...
}
@Override
public void onPlaybackStateChanged(PlaybackState state) {
super.onPlaybackStateChanged(state);
//播放状态信息回调,更新。PlaybackState在文章后面会提及
if (state.getState() == PlaybackState.STATE_PLAYING) {
//正在播放
}
...
//获取当前播放进度
long position = state