自動車用 App Actions

音声操作で、ドライバーはハンドルから手を離したり道路から目をそらしたりせずにタスクを実行できます。自動車向けアプリの App Actions により、ドライバーは Google アシスタントに「OK Google, ExampleApp で駐車場を探して」などと話しかけてインフォテインメント システム上の Android アプリを操作できます。

App Actions は自動車向けスポット(POI)アプリと連動します。このガイドでは、App Actions を POI アプリに統合するための具体的な要件と制限事項について説明します。

仕組み

App Actions は、アプリ内機能をアシスタントに拡張し、ユーザーが音声でアプリの機能を利用できるようにします。ユーザーが App Actions を呼び出すと、アシスタントはアプリの shortcuts.xml リソースで宣言された組み込みインテント(BII)とクエリを照合し、リクエストされた画面でアプリを起動します。

アプリでの BII のサポートは Android の capability 要素を使用して宣言します。Google Play Console を使用してアプリをアップロードすると、アプリで宣言されているケーパビリティが Google に登録され、ユーザーがアシスタントから利用できるようになります。

自動車のフルフィルメントを示すチャート。

  1. ユーザーがアシスタントをトリガーし、特定のアプリに対し音声でリクエストします。
  2. アシスタントが、事前トレーニング済みのモデル(BII)とリクエストを照合し、BII でサポートされているパラメータを抽出します。
  3. この例では、アシスタントは BII GET_CHARGING_STATION とクエリを照合し、位置情報パラメータ「SFO」を抽出して、位置情報を地理座標に変換します。
  4. アプリがこの BII のフルフィルメント定義を介してトリガーされます。
  5. アプリがフルフィルメントを処理し、ドライバーのインフォテインメント システムに充電スタンドのオプションが表示されます。

制限事項

自動車での App Actions の実装には次の制限事項が適用されます。

要件

App Actions 向けに自動車用アプリを準備する手順は次のとおりです。

  • App Actions に対する一般的な Android アプリ要件を満たすこと。
  • 自動車向けアプリ ライブラリの依存関係を含めること。詳しくは、依存関係を宣言するをご覧ください。

インテントとフルフィルメントを決定する

App Actions を使って自動車向けアプリを音声対応にする最初のステップは、アプリがサポートするユーザーの音声コマンド、つまりインテントを決定することです。決定したら、インテントごとにフルフィルメントを定義し、アプリがどのようにリクエストを満たす必要があるかを指定します。

  • 自動車用アプリがサポートするインテントの種類

    App Actions は、組み込みインテント(BII)という事前トレーニング済みの音声モデルを提供します。この BII は、ユーザーが「OK Google」と話しかけたときにユーザーの音声コマンドを理解し、解釈することができます。音声リクエストに応答するには、アプリがサポートしている BII をアシスタントに対し宣言するだけです。たとえば、アプリで駐車場を探せるようにするには、BII GET_PARKING_FACILITY を実装します。また、アプリで電気自動車の充電スタンドを探せるようにするには、BII GET_CHARGING_STATION を実装します。

  • アプリが各インテントを遂行する仕組み

    アプリは、適切な画面でアプリ自体を起動することで音声リクエストを遂行します。App Actions は、ユーザー リクエストから抽出したパラメータをフルフィルメントに提供し、ユーザーのニーズに合わせてレスポンスを調整できるようにしています。

App Actions を統合する

フルフィルメント戦略を決定したら、次の手順に沿って自動車向けアプリを音声対応にします。

  1. メイン アクティビティ AndroidManifest.xml を開き、Android ショートカットのサポートを宣言します。capability ショートカット要素を使用して、アプリがサポートする BII をアシスタントに対して宣言します。詳しくは、ケーパビリティを追加するをご覧ください。

     <!-- AndroidManifest.xml -->
     <meta-data
         android:name="android.app.shortcuts"
         android:resource="@x>ml/shortcuts" /
    
  2. 次に、<intent-filter> 要素を AndroidManifest.xml に追加します。これで、アシスタントはディープリンクを使用してアプリのコンテンツに接続できます。

    • Android Auto フルフィルメントの場合、<intent-filter> はモバイルアプリと同じです。

    • Android Automotive OS の場合、アプリの CarAppService セッションがアシスタントをトリガーします。セッションがディープリンクをトリガーできるようにするには、AndroidManifest.xml<activity> 要素で <intent-filter> を指定します。

    <!-- AndroidManifest.xml -->
    <activity
      ...
      android:name="androidx.car.app.activity.CarAppActi>vity"<;
      ...
      int>ent-fil<ter
          action android:name="android.intent>.action<.VIEW" /
          category android:name="android.i>ntent.c<ategory.DEFAULT" /
          category android:name="a>ndroid.<intent.category.BROWSABLE&quot; /
          data
            android:scheme=";YO>UR_<SCHEME"
     > <      android:host="YOUR_HOST" /
      /intent-filter
    /activity
    
  3. アプリの res/xml ディレクトリに shortcuts.xml ファイルがまだない場合は、新たに作成します。App Actions が Android ショートカットを使用する仕組みについて詳しくは、shortcuts.xml を作成するをご覧ください。

    shortcuts.xml で、選択した BII の capability を実装します。次に、ネストされた <intent> を追加してアプリのフルフィルメントを定義します。

    <!-- shortcuts.xml -->
    <?xml version="1.0" encodin>g<="utf-8"?
    shortcuts xmlns:android="http://schemas.and>roid<.com/apk/res/android"
    
      capability android:name="a>ction<s.inte>nt.GET_<PARKING_FACILITY"
        intent
          url-template
          android:value="YOUR_SCHEME://YOUR_HOST{?name,address,d>isambigu<atingDescription,latitude,longitude}&qu>ot;
    
      <    !-- Facility name, e.g. "Googleplex" --
          parameter
            and>roid:na<me="parkingFacility.name"
            android:key="name&quo>t;/
       <   !-- Address, e.g. "1600 Amphitheatre Pkwy, Mountain View, CA 94043" --
       >   para<meter
            android:name="parkingFacility.addr>ess&quo<t;
            android:key="address"/
          !-- Disambiguate the type of service, e.g. "valet" --
          par>ameter
    <        android:name="park>ingFaci<lity.disambiguatingDescription"
            android:key="disambiguatingDescription">;/
        <  !-- Latitude, e.g. "37.386>1"< --
          parameter
            android:name="parkingFacility.geo.latitude"
            andro>id:ke<y=">;la<titude">;</
          !->- Longitude, e.g. "-122.084" --
          parameter
            android:name="parkingFacility.geo.longitude"
            android:key="longitude"/
        /intent
      /capability
    /shortcuts
    
  4. 最後に、App Actions フルフィルメントの入力を処理するように自動車向けアプリの Session() ロジックを更新します。以下に、Session.onCreateScreen()Session.onNewIntent() のインテント処理の例を示します。

    onCreateScreen()

    Kotlin

    @Override
    fun onCreateScreen(@NonNull intent: Intent): Screen {
      if (intent.getData() != null) {
          val uri: Uri = intent.getData()
          // uri = &quot;YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
          // Build your Templates with parsed uri parameters
      ...
     }
    }

    Java

    @Override
    public Screen onCreateScreen(@NonNull Intent intent) {
    if (intent.getData() != null) {
      Uri uri = intent.getData();
      // uri = &quot;YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
      // Build your Templates with parsed uri parameters
    ...
    }
    }

    onNewIntent()

    Kotlin

    @Override
    fun onNewIntent(@NonNull intent: Intent): Screen {
      if (intent.getData() != null) {
          val uri: Uri = intent.getData()
          // uri = &quot;YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
          // Build your Templates with parsed uri parameters
          ...
      }
    }

    Java

    @Override
    public void onNewIntent(@NonNull Intent intent) {
    if (intent.getData() != null) {
     Uri uri = intent.getData();
     // uri = &quot;YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
     // Build your Templates with parsed uri parameters
     ...
    }
    }

アプリをプレビュー、テスト、公開する

App Actions には、アプリのプレビューとテストを行うためのツールが用意されています。このツール、および音声対応の自動車向けアプリを Play ストアに公開する方法について詳しくは、App Actions の概要をご覧ください。