MediaRouter:发现并切换媒体路由 · AndroidX 源码指南
AAndroidX 源码指南
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),并持有 MediaSessionCompatsetMediaSessionCompat)与路由音量等状态。
  • MediaRouteSelector / RouteInfo:描述”我要找什么”和”我找到了什么”。RouteInfo 携带设备类型、连接状态、音量等;选择后通过 MediaControlIntent 的动作(如 ACTION_PLAY)向目标发送控制指令。
  • MediaRouteProvider:设备侧适配层。App 通常不直接实现它,而是依赖 MediaRouteProviderService 或系统内置 provider(PlatformMediaRouter1RouteProviderSystemRoutingUsingMediaRouter2Receiver 等源码可见)。

与 MediaRouter2 的关系

本 checkout 中 MediaRouter2Utils.javaSystemRoutingUsingMediaRouter2Receiver 表明当前实现已经开始对接平台 MediaRouter2,部分系统路由通过 MediaRouter2 收口。写新代码前应先确认平台 android.media 的 MediaRouter2 能力;androidx.mediarouter 更多承担旧版本兼容与系统 UI(MediaRouteButtonMediaRouteActionProvider,位于 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,新代码先确认平台能力。

相关页面