アクティブ VIA の選択は、CarSettings の ManageAssistActivity
によって行われます。このフローは、設定画面の [デフォルトのアプリ] セクションの一部として、PackageInstaller
アプリによってトリガーされます。
図 1. 設定画面のデフォルトのアプリ
選択された VIA は、次の 2 つの方法でシステムに公開されます。
RolesManager
システム サービスの一部としてAssistUtils
内部 API を通じてVoiceInteractionManagerService
によって
候補 VIA のリストは、RolesManager
を使用してロール名 android.app.role.ASSISTANT
で取得できます。
起動ワードトリガー
Android には、ハードウェア DSP 上の抽象化として AlwaysOnHotwordDetector が用意されています。これにより、低エネルギー常時音声認識の音声モデルに VoiceInteractionService
を簡単に関連付けられます。これは非常に一般的な操作フローです。ユーザーが音声アプリ(VA)を操作して新しい会話を開始する必要があります。この方法で開始された音声セッションは SHOW_SOURCE_ASSIST_GESTURE flag
で識別されます。
図 2. 起動ワードトリガー
凡例: システム サービスは水色で、VIA コンポーネントは緑色で表示しています。
PTT トリガー
これは、ハードウェア ボタンの長押しまたは短押しに適用されます。AAOS では、PTT は CarInputService によって処理されます。デフォルトの実装では、このサービスは車両 HAL を介して受け取った入力イベントを処理します。音声操作の特定のケースでは、次のロジックをキーイベントに適用します。
- 短い PTT イベント(
KeyEvent.KEYCODE_VOICE_ASSIST
)がVoiceInteractionManagerService
に転送され、新しい音声セッションが開始します。 - 長い PTT イベントは、まずプロジェクション レシーバ(Android Auto や CarPlay など)に渡されてから、Bluetooth 接続デバイスに渡され、最後にローカル VIA アプリに渡されます。
このフローを使用して開始されたセッションは SHOW_SOURCE_PUSH_TO_TALK
で識別されます。
図 3. PTT トリガー
ハードウェアの音声操作ボタンを AAOS に統合する方法については、Automotive のキー入力の統合をご覧ください。
タップツートークのトリガー(またはソフトウェア ボタン)
システム UI から音声操作をトリガーするには、AssistUtil を使用します。これは非表示のシステム API であり、次のことを可能にするシステム UI などのバンドルされたシステムアプリでのみ使用できます。
VoiceInteractionManagerService
を操作して音声操作セッションを開始する。- 現在選択されている VIA を特定する。
選択した VIA アプリを動的に表示するために、システム UI は RoleManager
を使用し、ROLE_ASSISTANT
のロール所有者の変更をたどることができます。TTT トリガーの実装方法の例については、CarSystemUI、AssistantButton
をご覧ください。
図 4. タップツートークのトリガー
音声アシスタント タップツーリード(TTR)
Automotive では、INBOX
または INBOX_IN_GROUP
の通知として識別される、通知センターにポストされる通知(SMS メッセージなど)には、再生アクション ボタンが含まれます。このボタンを使用すると、ユーザーは選択した VIA によって通知を読み上げることができます。また、必要に応じて音声で返信することもできます。
図 5. 通知
このフローの実装方法について詳しくは、メッセージング コマンドの処理をご覧ください。
車用ランチャーから VIA を起動する
他のアプリと同様に、VIA は 1 つ以上のランチャー アクティビティをマニフェストに含めることができます。これらのアクティビティの動作内容は、アプリ デベロッパーと、このアプリのプリインストールを承認した OEM が決めます。
重要: Automotive では、システム アクティビティを含むすべてのアクティビティに、運転中の UX 制限が適用されます。ランチャー アイコンから有効にする機能を運転中に利用できるようにする必要がある場合は、許可リストに追加するか(OEM の場合)、アクティビティに distractionOptimized
メタデータでアノテーションを付けます。詳細については、ドライバーの注意散漫に関するガイドラインをご覧ください。
DSP とオーディオ HAL
同時キャプチャで、常時オンのオーディオ録音とオーディオ HAL に関する最新のガイドラインを必ず確認してください。これらの API にアクセスすると、起動ワードへの応答に記載されているように、起動ワード検出のパフォーマンスに大きな影響を与える可能性があります。
権限
システム特権の付与
特権はユーザーが付与できないため、VIA が特権を必要とする場合、OEM はシステム イメージに APK をプリロードし、ビルドでそうした権限を明示的に付与する必要があります。権限のリクエストをご覧ください。
そのためには、特権許可リストの依存関係をプロジェクトに追加します。
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
パーティションのフォルダ内に存在する必要があります(パーティションについて詳しくは、パーティションの概要とプロダクト パーティションの作成をご覧ください)。
2 番目のケースでは、ベンダー パーティションがシステムとは別に更新される可能性があるため、そこでホストされているアプリは @hide システム API にアクセスできません。プリインストール アプリの場所に応じて、更新は OTA として(OTA アップデート参照)、またはアプリストアからのアプリ アップデートを通じて行います。
カスタマイズ
Automotive 固有のコンセプトで説明したように、自動車では他のどのフォーム ファクタよりも、UI / UX の一貫性とカスタマイズが重要です。相互運用性を最大化するために、AAOS Car UI ライブラリを使用することを強くおすすめします。このライブラリには、OEM がカスタマイズするように設計された自動車アプリに統合できる、コンポーネントとリソースが含まれています。これにより、1 つの APK を組み込んで、各車種のデザインに合わせて UI をカスタマイズできます。