Google Assistant媒体播放命令无法启动安卓自定义媒体应用
Google Assistant 媒体播放指令跳转异常排查方案
按照以下顺序逐一排查即可解决当前语音指令触发非预期媒体应用的问题:
核心缺陷定位
MediaBrowserService的onGetRoot返回逻辑缺失
- 你当前实现的
onGetRoot仅添加了日志埋点,没有返回有效的BrowserRoot对象。当Google Assistant作为外部客户端绑定你的媒体服务时,如果拿到空返回,会直接判定你的服务不支持全局媒体浏览,自动 fallback 到系统默认的关联媒体应用(如TuneIn、YouTube Music)。 - 正确实现要求:
- 通过已实现的
PackageValidator校验调用方包名合法性 - 对所有合法调用方返回带实际媒体库根ID的
BrowserRoot,绝对不要返回null
参考正确实现:
override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot? { if (!packageValidator.isCallerAllowed(clientPackageName, clientUid)) { return BrowserRoot(MEDIA_ID_EMPTY_ROOT, null) } return BrowserRoot(MEDIA_ID_ROOT, null) } - 通过已实现的
onLoadChildren没有实际返回媒体内容
- 你当前的
onLoadChildren仅打印日志,没有通过result.sendResult()返回实际的媒体列表。Google Assistant会扫描服务返回的顶级媒体节点,判定应用支持的媒体类型,如果拿到空列表,会认为你的应用没有可被语音触发的播放内容,自然不会将播放指令路由到你的应用。 - 正确实现要求:对传入的每个parentId,加载对应层级的媒体条目,主动将结果返回给调用方,不要只做日志占位。
配置校验清单
- 校验
MEDIA_PLAY_FROM_SEARCH意图的挂载正确性:当前该意图挂载在Activity节点下是符合规范的,但要确认没有对该intent-filter添加额外的自定义data限制、没有将组件exported属性设为false,保证系统能正确索引到你的应用对该播放意图的支持能力。 - 校验Actions配置有效性:目前的Open Feature Actions能正常运行,仅说明页面跳转类动作被正确索引,不代表媒体播放类动作被关联到了应用包名。需要确认
@xml/actions配置中明确声明了应用支持的通用媒体播放能力,不要仅配置特定页面的跳转规则。 - 校验PlaybackState的声明时机:使用ExoPlayer+MediaSessionConnector的方案是正确的,但需要确认MediaSession初始化完成后,就立即声明核心支持动作(包括
ACTION_PLAY、ACTION_PLAY_FROM_SEARCH),不要等播放器实例完全初始化、有播放内容后才暴露这些能力——否则冷启动场景下Assistant扫描服务时,会判定你的应用不支持语音触发播放。 - 确认跨模块的manifest合并结果:由于你的AudioService位于独立的library模块,要检查编译生成的合并后manifest中,MediaBrowserService的intent-filter、exported属性没有被主模块的配置覆盖,保证服务的可发现性正常。
内容的提问来源于stack exchange,提问作者Katie B
相关产品推荐
相关产品推荐

