Android接入Google Cast如何实现类似AirPlay的音频镜像功能
Android端Google Cast适配(多ExoPlayer实例+音频镜像场景)方案
Google Cast没有和iOS端AVRoutePickerView()完全等价的零配置开箱即用控件,针对多播放器实例、需要类AirPlay音频镜像能力的场景,不用走官方文档里繁琐的自定义接收器、完整媒体栈适配流程,按以下路径实现即可:
- 路由选择控件优先复用SDK原生组件,不要自行实现局域网设备发现逻辑
如果你需要和Google Home一致的设备列表展示,直接用Cast SDK内置的MediaRouteChooserDialog,添加音频类Cast设备过滤规则即可,不需要额外配置接收器ID,用默认的媒体接收端ID就能覆盖所有支持音频投送的Chromecast、Nest音箱、带Cast能力的智能音频设备,点选设备后SDK自动完成连接握手,不需要手写连接逻辑。核心过滤代码参考:
如果你只需要兼容Android 11及以上版本,连Cast SDK都不用额外集成,直接唤起系统自带的媒体输出切换面板即可,这个面板里已经整合了所有Cast音频设备、蓝牙音频设备,投送逻辑是系统级的全音频镜像,和AirPlay的系统镜像效果完全一致:val castRouteSelector = MediaRouteSelector.Builder() .addControlCategory(CastMediaControlIntent.categoryForCast(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)) .build() val routeChooserDialog = MediaRouteChooserDialog(yourContext) routeChooserDialog.routeSelector = castRouteSelector // 需要弹出选路界面时直接调用show()即可 routeChooserDialog.show()
低版本兼容场景下,用前面提到的val mediaRouter = getSystemService(Context.MEDIA_ROUTER_SERVICE) as MediaRouter mediaRouter.showMediaRouterOutputSwitcher()MediaRouteChooserDialog做降级即可。 - 多ExoPlayer实例场景避坑
全局只维护一个单例的Cast会话管理器,不要给每个ExoPlayer实例单独绑定Cast会话。用户选中投送路由后,只需要把当前需要投出的播放器实例的媒体源、播放进度、播放状态同步给Cast会话绑定的RemoteMediaClient即可,其余本地播放的ExoPlayer实例完全不受影响。
不要直接依赖ExoPlayer官方提供的Cast扩展库,这个扩展是基于单播放器实例的场景设计的,多实例场景下会出现会话抢占、播放状态同步错乱的问题,手动维护全局会话的代码量更小,可控性更高。 - 音频镜像能力实现
如果需要实现和AirPlay一致的全应用音频镜像(而非仅投送App内的媒体流),不要走Cast SDK的媒体发送流程,直接用上述系统级媒体路由API即可,系统会自动接管所有音频流的投送,不需要你对每个播放器实例做单独适配。
配置流程简化提示:不需要申请自定义的Cast接收端ID,不需要配置接收器的样式、队列逻辑,直接用默认的公共媒体接收端ID就能满足纯音频投送需求,能砍掉90%左右的官方文档里要求的冗余配置项。
内容的提问来源于stack exchange,提问作者brettywhite
相关产品推荐
相关产品推荐

