概述:
有时用户会想要将媒体内容播放到更大更亮更响的设备上比如电视, 家庭影院等. 作为这些设备的生产厂家呢, 就需要允许Android的用户显示一个图片, 播放一首歌或者分享视频到这些设备上, 以便朋友和家人可以一起分享.
Android媒体路由框架允许制造商在他们的设备上启用播放功能, 这需要用到一个标准接口, 叫MediaRouteProvider. 路由提供者为在接收设备上播放媒体定义了一个普通的接口, 使得所有的可以支持媒体路由的APP都可以分享媒体到这些设备上.
Android媒体路由框架使得媒体APP开发者和媒体播放设备生产厂家可以通过普通的API和用户接口进行连接. APP开发者实现一个MediaRouter接口可以连接到framework然后播放内容给使用了媒体路由框架的设备. 媒体播放设备的生产厂商可以通过MediaRouterProvider提供对媒体路由框架的支持, 可以允许其它APP连接到他们的设备并播放媒体内容. 下图展示了一个APP如何通过媒体路由框架连接到接收设备:
当为接收设备创建一个媒体路由提供者的时候, 供应商需要达成以下目标:
1. 描述并发布接收设备的功能, 以便其他APP发现自己并使用它的播放功能.
2. 封装接收设备的编程接口和其他通信传输机制, 实现与媒体路由框架的兼容.
发布路由提供者(routeprovider):
一个媒体路由提供者作为Android APP的一部分被部署. 路由提供者可以通过继承MediaRouteProviderService被其他APP使用, 也可以封装自己的MediaRouteProvider的实现并用自己的service并为媒体路由提供者声明一个intentfilter. 这些步骤允许其它APP发现并使用我们的媒体路由. App可以包含媒体路由提供者的同时包含一个MediaRouter接口给路由提供者, 但是这并不是必须的.
播放的类型:
媒体路由框架主要支持两种播放类型. 一个媒体路由提供者可以支持一个或者两种类型的播放, 根据播放设备的能力和想要支持的功能, 播放类型主要有:
远程播放– 这种方法使用接收设备来处理媒体的接收, 解码和播放. 把用户使用的Android设备当做远程遥控器来使用. 比如Google Cast.
辅助输出– 这种方法则是由Android的媒体APP来负责接收解码和发送音视频给接收设备, 这种方法用来支持Android的无线显示输出设备.
上述两种方法的主要区别就在于解码的操作是由谁来负责的. 远程播放是由接收设备负责解码; 辅助输出则是由Android的手持设备负责解码.
创建一个ProviderService:
媒体路由框架必须可以发现和连接到媒体路由提供者, 这样才能被使用. 为了实现这个功能, 媒体路由框架会寻找声明了媒体路由提供者intent action的app. 当另外的app想要连接到我们的提供者的时候, 框架必须可以调用和连接到它, 这样的话就要求提供者必须封装在一个service中. 下面的代码演示了如何在manifest中声明一个媒体路由提供者service和intent filter, 这允许它被媒体路由框架发现和使用:
<service android:name=".provider.SampleMediaRouteProviderService"
android:label="@string/sample_media_route_provider_service"
android:process=":mrp">
<intent-filter>
<action android:name="android.media.MediaRouteProviderService"/>
</intent-filter>
</service>
这个manifest栗子声明了一个service, 它封装了真正的媒体路由提供者类. Android媒体路有框架提供了MediaRouteProviderService类用来给媒体路由提供者提供基类, 下面的代码演示了如何封装这个类:
public class SampleMediaRouteProviderService extends MediaRouteProviderService { @Override public MediaRouteProvider onCreateMediaRouteProvider() { return new SampleMediaRouteProvider(this); } }
指定路由能力:
连接到媒体路由框架的APP可以通过APP的manifest生命发现我们的媒体路由, 但是它们也需要知道我们的媒体路由提供的能力. 媒体路由可以有不同的功能, 不同的类型, 其它的APP需要知道这些信息, 才能判断它们是否兼容我们的媒体路由. 媒体路由框架允许我们通过IntentFilter对象, MediaRouteDescriptor对象和一个MediaRouteProviderDescriptor来定义和发布媒体路由的能力. 详情如下:
路由种类:
作为媒体路由提供者的方案描述, 我们必须制定提供者是否支持远程播放, 辅助输出或者两个都有. 这些是媒体路由框架提供的路由种类:
CATEGORY_LIVE_AUDIO – 辅助输出设备的音频输出, 比如支持无线的音乐系统.
CATEGORY_LIVE_VIDEO – 辅助输出设备的视频输出, 比如无线显示设备.
CATEGORY_REMOTE_PLAYBACK – 在一个指定设备上播放音/视频, 该设备处理媒体获取解码和播放, 比如Chromecast设备.
想要在媒体路由的描述中包含这些设计, 我们需要将它们插入到一个IntentFilter对象中, 然后将IntentFilter对象加入到MediaRouteDescriptor对象中:
public final class SampleMediaRouteProvider extends MediaRouteProvider { private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC; static { IntentFilter videoPlayback = new IntentFilter(); videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); CONTROL_FILTERS_BASIC =