通过 CarSettings 中的 ManageAssistActivity
完成有效 VIA 的选择。此流程由 PackageInstaller
应用触发,这是“设置”屏幕的“默认应用”部分的一部分。
图 1. “设置”屏幕上的“默认应用”
所选 VIA 以两种方式向系统公开
- 作为
RolesManager
系统服务的一部分 - 通过
VoiceInteractionManagerService
,通过AssistUtils
内部 API。
可以使用角色名称为 android.app.role.ASSISTANT
的 RolesManager
获取候选 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
分区和文件夹下(如需详细了解分区,请参阅 分区概览 和 构建产品分区)。
在第二种情况下,鉴于 vendor 分区可以与系统分区分开更新,因此托管在此处的应用将无法访问 @hide 系统 API。根据预安装的应用的位置,更新可以通过 OTA(请参阅 OTA 更新)执行,也可以通过应用商店中的应用更新执行。
自定义
如Automotive 特定概念中所述,在汽车中,UI/UX 一致性和自定义比在任何其他外形规格中都更重要。为了获得最大的互操作性,强烈建议使用 AAOS Car UI 库。此库包含可以集成到汽车应用中的组件和资源,旨在由 OEM 进行自定义。这样,就可以构建单个 APK,使其 UI 可以自定义为每种车型设计。