集成流程

通过 CarSettings 中的 ManageAssistActivity 完成有效 VIA 的选择。此流程由 PackageInstaller 应用触发,这是“设置”屏幕的“默认应用”部分的一部分。

Default apps on the Settings screen

图 1. “设置”屏幕上的“默认应用”

所选 VIA 以两种方式向系统公开

  1. 作为 RolesManager 系统服务的一部分
  2. 通过 VoiceInteractionManagerService,通过 AssistUtils 内部 API。

可以使用角色名称为 android.app.role.ASSISTANTRolesManager 获取候选 VIA 的列表。

热词触发

Android 提供了 AlwaysOnHotwordDetector 作为硬件 DSP 之上的抽象层。这提供了一种将 VoiceInteractionService 与语音模型相关联以便进行低功耗常时开启语音识别的便捷方式。这是最常见且众所周知的互动流程,用户在其中请求与语音应用 (VA) 互动以发起新的对话。以这种方式启动的语音会话通过 SHOW_SOURCE_ASSIST_GESTURE flag 标识。

Hotword triggering

图 2. 热词触发

图例。系统服务以浅蓝色显示,VIA 组件以绿色显示。

PTT 触发

这适用于长按或短按硬件按钮。在 AAOS 中,PTT 由 CarInputService 处理。在默认实现中,此服务处理通过车辆 HAL 接收的输入事件,并且在语音互动的特定情况下,它将以下逻辑应用于按键事件

  • 短 PTT 事件 (KeyEvent.KEYCODE_VOICE_ASSIST) 将定向到 VoiceInteractionManagerService 以启动新的语音会话。
  • 长 PTT 事件首先会移交给投影接收器(例如,Android Auto 或 CarPlay),然后移交给通过蓝牙连接的设备,最后移交给本地 VIA 应用。

使用此流程启动的会话通过 SHOW_SOURCE_PUSH_TO_TALK 标识。

PTT triggering

图 3. PTT 触发

要将硬件语音控制按钮集成到 AAOS,请参阅Automotive 按键输入集成。

点按通话触发(或软件按钮)

从系统界面触发语音互动是通过 AssistUtil 完成的。这是一个隐藏的系统 API,只能由捆绑的系统应用(例如,启用以下功能的系统界面)使用

  • VoiceInteractionManagerService 互动以启动语音控制会话。
  • 确定当前选择的 VIA 是哪个。

为了动态呈现所选的 VIA 应用,系统界面可以使用 RoleManager 并跟踪 ROLE_ASSISTANT 的角色持有者的变化。在 CarSystemUI AssistantButton 中可以找到如何实现 TTT 触发的示例。

Tap-to-Talk triggering

图 4. 点按通话触发

语音助理点按朗读 (TTR)

在 Automotive 中,发布到通知中心且标识为 INBOXINBOX_IN_GROUP 通知(例如,短信)的通知包含“播放”操作按钮,用户可以使用该按钮让所选 VIA 朗读通知,并可选择通过语音回复。

Notifications

图 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 可以自定义为每种车型设计。