如何让 Google Assistant 调用你的 TV 应用播放特定内容?
解读
面试官想确认三件事:
- 你是否知道国内 Android TV 盒子/电视无法直接使用 Google Assistant,只能走“谷歌国内合规方案”或厂商自建语音平台;
- 你是否能把“语音意图”映射到“TV 应用深层链接”这一套完整通路讲清楚,包括 App Actions、Capability、deeplink、权限、签名、测试;
- 你是否能给出可落地的中国版替代方案(如华为小艺、小米小爱、OPPO 小布、腾讯叮当、阿里 AliGenie),并说明如何复用同一套 intent-filter 与 Metadata,减少双端维护成本。
回答时先承认国内限制,再给出“Google 官方路径 + 国内合规路径”两套答案,体现严谨与业务敏感度。
知识点
- Android TV 国内生态现状:GMS 缺失,Google Assistant 服务不可用,厂商语音 SDK 各自实现。
- App Actions Built-in Intent:actions.intent.PLAY_OBJECT、actions.intent.OPEN_APP_FEATURE,需声明 capability 与 fulfillment 的 deeplink。
- shortcuts.xml 与 actions.xml:声明 capability、必需参数(name、content.type、identifier)、可选枚举(@type/TVSeries、Movie、Episode)。
- 深层链接统一入口:android-app://<package>/<scheme>/<path>?id=xxx 或 android-app://<package>/play/?id=xxx,需同时配置 intent-filter 与验证 assetlinks.json。
- 签名与验证:上传签名指纹到 Google Play Console 完成域名关联;国内厂商平台(如小米技能平台)同样要求 SHA256 指纹。
- 测试工具:
- Google:Assistant Plugin、App Actions Test Tool(需美区账号+VPN);
- 国内:小米小爱开发者平台“真机测试”、华为“智慧生活云测”。
- 权限与导出组件:TV 应用必须 exported=true,权限可空或自定义 signature 级,防止第三方唤端。
- 多语言与语义槽:中文标签需写在 shortcuts.xml 的 <parameter> 中,如 android:label="@string/movie_label",方便国内 ASR 识别。
- fallback 策略:若用户设备无语音能力,应在 Launcher 首页保留搜索入口,统一跳转到同一条 deeplink,确保代码只有一份。
- 性能与安全:deeplink 接收 Activity 建议用 singleTask,防止多次 new task 导致重复创栈;接收参数后做 URI 白名单校验,防止 Intent 劫持。
答案
国内面试场合,建议采用“1 句现状 + 2 套方案 + 3 步落地”的结构回答:
“由于国内 Android TV 无法使用 Google Assistant,我会先说明官方标准流程,再给出国内合规落地版本。”
一、官方标准流程(答给面试官看深度)
- 在 AndroidManifest 中声明 android.intent.category.LEANBACK_LAUNCHER 主 Activity,并附加 android.intent.category.DEFAULT 以便接收 implicit deeplink。
- 新建 res/xml/shortcuts.xml,定义 capability:
<capability android:name="actions.intent.PLAY_OBJECT"> <intent android:targetClass=".PlayActivity"> <parameter android:name="object.name" android:key="name"/> <parameter android:name="object.identifier" android:key="id"/> </intent> </capability> - 在 PlayActivity 解析 getIntent().getData(),若 scheme=“content”且 host=“play”,则按 id 查询本地 Room 数据库,找到对应视频 URL 后交给 ExoPlayer。
- 在 Google Play Console → App Actions 工具上传签名指纹,并填写 fulfillment 域名,完成 HTTPS 域名与包名校验。
- 使用 App Actions Test Tool 输入“play Kung Fu Panda on DemoTV”,验证是否成功拉起 PlayActivity 并自动播放。
二、国内合规方案(答给面试官看落地)
- 选择厂商语音平台:小米小爱、华为小艺、OPPO 小布均支持“技能+deeplink”模式,以小米为例,在小米开放平台创建“视频技能”,填写同一条 android-app:// 链接。
- 在 shortcuts.xml 中再加一套中文 parameter 标签,label 引用 @string/movie_name_zh,供 ASR 识别“播放功夫熊猫”。
- 在 TV 端集成厂商语音 SDK(通常是一个 200KB 的 jar),注册监听器,收到“play”指令后组装 Intent 并 startActivity,代码与 Google 端完全一致,实现“一套代码、多端语音”。
- 上线前用厂商提供的真机测试白名单,确保语音指令能 100% 拉起目标页面;同时在国内渠道包关闭 android.intent.category.LEANBACK_LAUNCHER 的 GMS 依赖,防止启动器找不到图标。
三、落地三步总结
- 统一 deeplink:scheme、host、参数名全部固定,写在 Gradle 的 buildConfigField 中,方便双端复用。
- 统一入口 Activity:singleTask + 参数校验,播放失败一律弹 Toast“内容不存在”,防止 crash。
- 统一签名指纹:把 SHA256 写进 CI,打包后自动提交到 Google Play Console 与各家厂商后台,减少手工误差。
这样即可在“面试深度”与“国内可行性”之间取得平衡。
拓展思考
- 如果未来 Google Assistant 通过 Chrome 浏览器在国内提供 Web 版语音入口,是否可以直接把 fulfillment 改成 https:// 链接,让 PWA 中转跳回 TV 应用?需要注意什么?
- 当 TV 应用同时接入了 Google 的 MediaSession 与厂商的 CaaS(Content as a Service)协议,如何确保语音指令只触发一次播放,避免双实例?
- 折叠屏与车载屏幕场景下,同一套 App Actions capability 是否仍然适用?是否需要新增 actions.intent.GET_NAVIGATION_OBJECT 等新的 BI 意图?
- 在隐私合规方面,语音平台会回传用户 query 给开发者,如何在 TV 端做匿名化与加密存储,满足《个人信息保护法》对“敏感个人信息”的单独授权要求?