前言
CarMediaService 是AAOS中统一管理媒体播放控制、信息显示和用户交互等功能的服务。这一服务依赖于android MediaSession框架。 所以首先需要简单的了解一下MediaSession。
MediaSession
MediaSession 框架规范了音视频应用中界面与播放器之间的通信接口,实现界面与播放器之间的完全解耦。MediaSession 框架定义了媒体会话和媒体控制器两个重要的类,它们为构建多媒体播放器应用提供了一个完善的技术架构。
AAOS上面的MediaSession的控制框图如上主要是MediaControl和MediaSession两个类直接的交互。
-
MediaControl是UI端控制Service端的类,在AAOS中所有的app播放控制客户端的实现都是carMediaApp中MediaControl的实现的(包括蓝牙audio localplayer界面中暂停播放,下一首 上一首等等)。
-
MediaSession是服务端, 这个服务端包括(蓝牙的src\com\android\bluetooth,和/apps/Car/LocalMediaPlayer)。这这里面实现了Mediassion 的callback 用来响应client 端UI的控制。 而响应之后的状态改变可以通过继承MediaControl的callback 在客户端实现。
CarMediaService
作用是什么?提供了哪些接口?如何使用?
-
用途
CarMediaService通过CarMediaManager给外部应用提供使用的API。
这些api允许开发者控制车辆中的主要媒体源,以及获取与这一媒体源相关的更新信息。通过这个 API 来实现媒体播放控制、信息显示和用户交互等功能。 -
接口
CarMediaManger是客户端 通过AIDL的接口 调用到CarMediaService中。 提供的AIDIL的接口如下:
- 获取/设置提供模式下当前活动的媒体源。
其中模式包括播放和浏览: 是指应用的操作可以是浏览媒体 或者是操作播放媒体。
其中MediaSource的理解:可以认为是执行具体播放操作的一个应用 是媒体播放控制的对象比如蓝牙音乐播放器、本地的播放器等等。 - 注册/反注册回调,监听媒体活动源的更新。同样模式可以是浏览或者播放。
综上可以看到carMediaService 是实现所有媒体相关的ui 浏览和控制的统一管理。 监听媒体源的变化,控制活动和非活动媒体源的播放、退出、暂停等等。
interface ICarMedia {
/** Gets the currently active media source for the provided mode */
ComponentName getMediaSource(int mode);
/** Sets the currently active media source for the provided mode */
void setMediaSource(in ComponentName mediaSource, int mode);
/** Register a callback that receives updates to the active media source */
void registerMediaSourceListener(in ICarMediaSourceListener callback, int mode);
/** Unregister a callback that receives updates to the active media source */
void unregisterMediaSourceListener(in ICarMediaSourceListener callback, int mode);
/** Retrieve a list of media sources, ordered by most recently used */
List<ComponentName> getLastMediaSources(int mode);
/** Returns whether the browse and playback sources can be changed independently. */
boolean isIndependentPlaybackConfig();
/** Sets whether the browse and playback sources can be changed independently. */
void setIndependentPlaybackConfig(boolean independent);
}
- 使用流程
首先获取CarMediaManager,然后注册MediaSource变化的监听,在mediasource有变化的时候更新ui。
mHandler = new Handler(application.getMainLooper());
mMediaSourceListener = componentName -> mHandler.post(
() -> updateModelState(mInputFactory.getMediaSource(componentName