集成流程

活跃 VIA 的选择由 ManageAssistActivity 在 CarSettings 中完成。此流程由 PackageInstaller 应用触发,是“设置”屏幕中“默认应用”模块的一部分。

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

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

选定的 VIA 会通过两种方式提供给系统:

  1. 作为 RolesManager 系统服务的一部分提供
  2. 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 进行标识。

PTT 触发

图 3. PTT 触发

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

“点按后说话”触发(或软件按钮)

在系统界面中触发语音交互的操作使用 AssistUtil 完成。这是一个隐藏的系统 API,只能由捆绑的系统应用(例如支持下列功能的系统界面)使用:

  • 通过与 VoiceInteractionManagerService 交互来启动语音控制会话。
  • 确定哪个是当前选定的 VIA。

为了动态呈现选定的 VIA 应用,系统界面可以使用 RoleManager 并跟随 ROLE_ASSISTANT 的角色持有者作出更改。可以在 CarSystemUI AssistantButton 中找到有关如何实现 TTT 触发的示例。

“点按后说话”触发

图 4. “点按后说话”触发

语音助理点读功能 (TTR)

在 Automotive 中,发布到通知中心并被标识为 INBOXINBOX_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 的构建可以支持其界面根据每个车型的设计进行自定义。