活跃 VIA 的选择由 ManageAssistActivity
在 CarSettings 中完成。此流程由 PackageInstaller
应用触发,是“设置”屏幕中“默认应用”模块的一部分。
图 1. “设置”屏幕上的“默认应用”
选定的 VIA 会通过两种方式提供给系统:
- 作为
RolesManager
系统服务的一部分提供 - 由
VoiceInteractionManagerService
通过AssistUtils
内部 API 提供。
可以使用 RolesManager
和角色名称 android.app.role.ASSISTANT
来获取候选 VIA 列表。
启动指令触发
Android 提供 AlwaysOnHotwordDetector 作为硬件 DSP 之上的一种抽象。这提供了一种便捷的方式,供您将 VoiceInteractionService
与语音模型关联起来,从而实现始终开启的低功耗语音识别。这是最常见、最广为人知的交互流程,在此流程中,用户会请求与语音应用 (VA) 进行交互,以发起新的对话。以这种方式启动的语音会话使用 SHOW_SOURCE_ASSIST_GESTURE flag
进行标识。
图 2. 启动指令触发
图例。系统服务显示为浅蓝色,VIA 组件显示为绿色。
PTT 触发
这适用于长按或短按硬件按钮。在 AAOS 中,PTT 由 CarInputService 处理。在默认实现中,此服务会处理通过车载 HAL 收到的输入事件,并在语音交互这一特殊情境中对关键事件采用以下逻辑:
- 短按 PTT 事件 (
KeyEvent.KEYCODE_VOICE_ASSIST
) 将被定向到VoiceInteractionManagerService
,以启动新的语音会话。 - 长按 PTT 事件将首先传递到投射接收器(如 Android Auto 或 CarPlay),然后再传递到已通过蓝牙连接的设备,最后传递到本地 VIA 应用。
按照此流程启动的会话使用 SHOW_SOURCE_PUSH_TO_TALK
进行标识。
图 3. PTT 触发
如需将硬件语音控制按钮集成到 AAOS,请参阅 Automotive 按键输入集成。
“点按后说话”触发(或软件按钮)
在系统界面中触发语音交互的操作使用 AssistUtil 完成。这是一个隐藏的系统 API,只能由捆绑的系统应用(例如支持下列功能的系统界面)使用:
- 通过与
VoiceInteractionManagerService
交互来启动语音控制会话。 - 确定哪个是当前选定的 VIA。
为了动态呈现选定的 VIA 应用,系统界面可以使用 RoleManager
并跟随 ROLE_ASSISTANT
的角色持有者作出更改。可以在 CarSystemUI AssistantButton
中找到有关如何实现 TTT 触发的示例。
图 4. “点按后说话”触发
语音助理点读功能 (TTR)
在 Automotive 中,发布到通知中心并被标识为INBOX
或 INBOX_IN_GROUP
通知(如短信)的通知将包含一个“播放”操作按钮;通过此按钮,用户可以用选定的 VIA 朗读通知,并可以选择通过语音回复。
图 5. 通知
如需详细了解如何实现此流程,请参阅处理消息传递命令。
通过车用启动器启动 VIA
与任何其他应用一样,VIA 的清单中可以包含一个或多个启动器 activity。应用开发者和将要预安装此应用的原始设备制造商 (OEM) 负责决定这些 activity 的功能。
重要提示:在 Automotive 中,所有 activity(包括系统 activity)在驾车时都受到用户体验限制的约束。如果您希望通过启动器图标启用的体验一定要在驾车时可用,可将其添加到许可名单中(如果您是 OEM),或者使用 distractionOptimized
元数据为该 activity 添加注解。如需了解详情,请参阅有关防止驾驶员分心的准则。
DSP 和音频 HAL
请务必查看并发捕获,了解更新后的有关始终开启的并发音频录制和音频 HAL 的准则。对这些 API 的访问权限可能会对启动指令检测的性能产生重大影响,如响应启动指令中所述。
权限
授予系统特许权限
鉴于用户不得授予特许权限,如果某个 VIA 需要其中的任一权限,OEM 必须将其 APK 预加载到系统映像中,并在 build 中明确授予这些权限。请参阅请求权限。
为此,请向您的项目添加特权许可名单依赖项:
Android.bp
android_app { ... required: ["privapp_allowlist_com.example.myvoicecontrol"], ... }
将系统特权许可名单权限文件添加到 yourdata/etc/car
文件夹中:
vendor/…/data/etc/car/Android.bp
prebuilt_etc { name:privapp_allowlist_com.example.myvoicecontrol", sub_dir: "permissions", src: "com.example.myvoicecontrol.xml", filename_from_src: true, }
vendor/…/data/etc/car/com.example.myvoicecontrol.xml
<?xml version="1.0" encoding="utf-8"?> <permissions> <privapp-permissions package="com.android.car.voicecontrol"> <permission name="android.permission.MEDIA_CONTENT_CONTROL"/> </privapp-permissions> </permissions>
危险权限的预先授予
如请求权限中所述,VIA 需要征得用户同意才能使用某些功能。其中一些权限已预先授予默认的 VoiceInteractionService
(请参阅 DefaultPermissionGrantPolicy.java
)。如需详细了解默认处理程序的权限,请参阅仅在默认处理程序中使用的权限。您还可以使用 default-permissions.xml
配置文件预先授予权限。如需详细了解预先授予权限的相关限制,请参阅 Android 兼容性定义文档 (CDD) 中的第 9 节。
重要提示:在任何情况下,只有默认的 VIA 才会被预先授予这些权限。如果系统预加载了多个 VIA,非默认 VIA 必须在设置期间或首次使用时明确向用户请求权限。
分发(预安装和部署更新)
预安装的 VIA 必须位于 /product/priv-apps
或 /vendor/priv-apps
分区和文件夹下(如需详细了解分区,请参阅分区概览以及构建 product 分区)。
在第二种情况下,鉴于 vendor 分区可以与系统分开更新,托管在此处的应用将无法访问 @hide 系统 API。根据预安装应用所在的位置,可以 OTA 的形式(请参阅 OTA 更新)进行更新,也可通过应用商店提供的应用更新进行更新。
自定义
正如特定于 Android Automotive 的概念中所述,与任何其他设备类型相比,界面/用户体验的一致性和自定义功能在 Automotive 设备中更为重要。为了最大限度地提高互操作性,强烈建议使用 AAOS 车载设备界面库。 此库包括可以集成到汽车应用中的组件和资源,这些组件和资源可以由 OEM 自定义。这样一来,单个 APK 的构建可以支持其界面根据每个车型的设计进行自定义。