Web 与外部内容
Web 与外部内容 · androidx.browser
MediaRouter:发现并切换媒体路由Browser 1.11.0-alpha01
MediaRouteSelector 发现、MediaRouter 回调与 MediaRouteProvider 的职责划分。
最后更新 2026-08-01
复制即用:完整发现 + 选择
MediaRouter router = MediaRouter.getInstance(context);
// 声明要发现什么
MediaRouteSelector selector = new MediaRouteSelector.Builder()
.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
.build();
// 回调:路由出现/消失/选中
MediaRouter.Callback callback = new MediaRouter.Callback() {
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route, int reason) {
// 用户选中投屏设备
startPlaybackTo(route);
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route, int reason) {
stopPlayback();
}
@Override
public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) {
// 新设备出现
}
@Override
public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo route) {
// 设备消失
}
};
router.addCallback(selector, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
// 页面销毁时移除
@Override
protected void onStop() {
super.onStop();
router.removeCallback(callback);
}androidx.mediarouter 不播放媒体,它管理”路由”:把应用要播放的内容交给本地扬声器、蓝牙耳机、投屏设备或远端接收器。MediaRouter.getInstance 拿到全局单例,MediaRouteSelector 声明要发现什么类型的目标,MediaRouter.Callback 接收路由出现、消失、选中、取消选择的事件。
三层职责
MediaRouter:应用侧入口,负责发现与选择(selectRoute/unselect),并持有MediaSessionCompat(setMediaSessionCompat)与路由音量等状态。MediaRouteSelector/RouteInfo:描述”我要找什么”和”我找到了什么”。RouteInfo携带设备类型、连接状态、音量等;选择后通过MediaControlIntent的动作(如ACTION_PLAY)向目标发送控制指令。MediaRouteProvider:设备侧适配层。App 通常不直接实现它,而是依赖MediaRouteProviderService或系统内置 provider(PlatformMediaRouter1RouteProvider、SystemRoutingUsingMediaRouter2Receiver等源码可见)。
与 MediaRouter2 的关系
本 checkout 中 MediaRouter2Utils.java 和 SystemRoutingUsingMediaRouter2Receiver 表明当前实现已经开始对接平台 MediaRouter2,部分系统路由通过 MediaRouter2 收口。写新代码前应先确认平台 android.media 的 MediaRouter2 能力;androidx.mediarouter 更多承担旧版本兼容与系统 UI(MediaRouteButton、MediaRouteActionProvider,位于 mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/)。
常见陷阱
- 忘移除回调:onStop 不移除,页面销毁后仍收事件。
- 回调驱动假设:路由可能随时消失,
onRouteUnselected必须处理。 - 发现范围太宽:selector 类别决定扫描范围,别用通配扫所有设备。
- 把 MediaRouter 当播放器:它只路由,播放走 MediaControlIntent。
明确不解决什么
- 不做媒体播放:播放、进度、元数据由播放器或接收端通过
MediaControlIntent/MediaSessionStatus完成。 - 不扫描所有物理设备:发现范围由
MediaRouteSelector的控制类别决定。 - 不保证路由一直存在:回调驱动,路由消失时必须处理
onRouteUnselected。
要点
MediaRouter+MediaRouteSelector+Callback三件套完成发现/选择。- 回调要在 onStop 移除;路由消失必须处理。
- 三层职责:Router 入口、Selector/RouteInfo 描述、Provider 适配。
- 已开始对接 MediaRouter2,新代码先确认平台能力。