Android ウィジェットを Google アシスタントと統合する

1. 概要

1 つ目の App Actions Codelab では、Fitness BII カテゴリの組み込みインテント(BII: Built-In Intent)を実装し、サンプル フィットネス アプリを Google アシスタントに拡張する方法を学びました。

App Actions を使用すると、「OK Google, ExampleApp でランニングを開始」のように話しかけるだけで、アプリの特定の機能をアシスタントから直接起動できます。アプリを起動するだけでなく、ユーザーに対してインタラクティブな Android ウィジェットを表示し、使用可能な BII のリクエストに対応することもできます。

ユーザークエリによってアプリの GET_EXERCISE_OBSERVATION BII ケーパビリティが\nトリガーされ、アシスタントからの応答としてウィジェットが返された画面。

目標

この Codelab では、アシスタントのユーザーからのリクエストに応じて Android ウィジェットを返す方法を学びます。以下についても学習します。

  • BII パラメータを使用してウィジェットをカスタマイズする方法。
  • アシスタントが読み上げる案内用の TTS(テキスト読み上げ)をウィジェットに提供する方法。
  • 組み込みインテントのリファレンスを使用して、ウィジェットのフルフィルメントをサポートする BII を特定する方法。

前提条件

先に進む前に、App Actions の開発環境が整っていることを確認してください。以下が必要です。

  • シェルコマンドを実行するためのターミナル(git がインストールされていること)。
  • Android Studio の最新の安定版。
  • インターネットにアクセスできる Android デバイス(実機または仮想デバイス)。
  • Android Studio、Google アプリ、Google アシスタント アプリにログインしている Google アカウント。

実機を使用する場合は、ローカルの開発マシンに接続します。

2. 仕組みを理解する

Google アシスタントは、自然言語理解(NLU)によってユーザーのリクエストを読み取り、アシスタントの組み込みインテント(BII)と照合します。一致する BII が見つかると、その BII を実装するケーパビリティにインテントをマッピングします。このケーパビリティは、そのインテント用にアプリに登録したものです。最後に、このケーパビリティ内の詳細情報に基づいて生成された Android ウィジェットを表示し、ユーザーからのリクエストに対応します。

この Codelab では、GET_EXERCISE_OBSERVATION BII のサポートを登録するケーパビリティを定義します。このケーパビリティでは、FitActions ウィジェット クラスに対する Android インテントを生成し、この BII のリクエストに対応するようアシスタントに指示します。このクラスを更新すると、ユーザーに対して表示するカスタマイズされたウィジェットと、アシスタントが読み上げる案内用の TTS が生成されます。

下の図に一連の流れを示します。

アシスタント ウィジェットのフルフィルメントを示すフロー図。

FitActions ウィジェット

FitActions サンプルアプリには、ユーザーがホーム画面に追加できるエクササイズ情報ウィジェットが含まれています。ここでは、このウィジェットを使用して、GET_EXERCISE_OBSERVATION BII をトリガーするユーザークエリに対応します。

ウィジェットの仕組み

ユーザーがホーム画面にウィジェットを追加すると、ウィジェットがデバイスのブロードキャスト レシーバに対して ping を実行します。このサービスにより、アプリの AndroidManifest.xml リソース内のウィジェットのレシーバの定義から、ウィジェットに関する情報が取得されます。この情報は、ウィジェットを表す RemoteViews オブジェクトを生成する際に使用します。

サンプルアプリでは、StatsWidgetProvider クラスに対応するレシーバ widgets.StatsWidgetProvider を定義しています。

<!-- app/src/main/AndroidManifest.xml -->

<receiver
  android:name=".widgets.StatsWidgetProvider"
  android:exported="false">
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml/stats_widget" />
</receiver>

StatsWidgetProvider クラス(StatsWidgetProvider.kt)は、StatsWidget オブジェクトの作成フローを管理します。以下の役割を担います。

  • ウィジェットのインスタンスを作成し、アプリ データベースから取得したエクササイズ データを入力する。
  • formatDataAndSetWidget() でエクササイズ データをフォーマットして読みやすくする。
  • エクササイズ データを取得できない場合は、setNoActivityDataWidget() を使用してデフォルト値を提供する。

アシスタントのサポートを追加する

この Codelab では、サンプルアプリを更新して App Actions 機能を処理できるようにします。変更する点は以下のとおりです。

  1. GET_EXERCISE_OBSERVATION BII ケーパビリティを構成し、StatsWidget オブジェクトのインスタンスが返されるようにする。
  2. StatsWidget クラスを更新し、以下のような App Actions 機能を使用できるようにする。
    • ユーザーが「OK Google, ExampleApp にランニングの統計情報を表示」と話しかけたら、BII パラメータを使用して特定のエクササイズの統計情報を表示する。
    • 案内用の TTS 文字列を提供する。
    • ユーザークエリにエクササイズの種類を表すパラメータが含まれていない場合など、特殊なケースに対応する。

3. 開発環境を準備する

ベースファイルをダウンロードする

次のコマンドを実行して、サンプルアプリの GitHub リポジトリのクローンを作成します。

git clone --branch start-widget-codelab https://github.com/actions-on-google/appactions-fitness-kotlin.git

リポジトリのクローンが作成されたら、Android Studio でリポジトリを開きます。手順は次のとおりです。

  1. [Welcome to Android Studio] ダイアログで、[Import project] をクリックします。
  2. リポジトリのクローンを作成したフォルダを探して選択します。

この Codelab のアプリの完成版を確認するには、--branch master フラグを使用してサンプルアプリのリポジトリのクローンを作成します。

Android アプリケーション ID を変更する

この Codelab では、Google アシスタント プラグインを使用し、実機または仮想デバイスでアクションをテストします。このテストツールを実行するには、Google Play Console のプロジェクトにアプリをアップロードしておく必要があります。Google Play Console にアプリをアップロードする際は、パッケージ名の重複によるエラーを回避するため、サンプルアプリの applicationId を固有の ID に変更してください(Google Play に複数のアプリを同じ applicationId でアップロードすることはできないため)。

  1. app/build.gradle で、applicationId の値 PUT_YOUR_APPLICATION_ID_HERE を固有の ID(例: com.codelabs.myname)に変更します。Android アプリケーション ID について詳しくは、アプリケーション ID を設定するをご覧ください。
  2. app/src/res/xml/shortcuts.xml を開き、android:targetPackage の 2 つのインスタンスを固有の applicationId に変更します。

Google Play Console にアップロードする

Android Studio の Google アシスタント プラグインを使用するには、Google Play Console 内のプロジェクトにアプリをアップロードする必要があります。Android Studio でアプリをビルドし、内部リリースのドラフトとして Google Play Console にアップロードします。

Android Studio でアプリをビルドする手順は次のとおりです。

  1. [Build] > [Generate Signed Bundle / APK] に移動します。
  2. [Android App Bundle] を選択し、[Next] をクリックします。
  3. アプリに署名するための詳細を入力し、[Next] をクリックします。[Destination Folder] セクションで、生成されたバンドルへのパスを確認します。
  4. ビルド バリアントとして prodRelease または release を選択し、[Finish] をクリックします。

前の手順で作成した App Bundle を、新しいアプリとして Google Play Console にアップロードします。

  1. [すべてのアプリ] ページで、[アプリを作成] をクリックします。
  2. [アプリ名] ボックスにアプリの名前(例:「ウィジェット Codelab」)を入力します。
  3. [アプリ / ゲーム] で [アプリ] を選択します。
  4. [無料 / 有料] で [無料] を選択します。
  5. 表示された [申告] に同意します。
  6. [アプリを作成] をクリックします。
  7. Google Play Console のサイドメニューから [テスト] に移動し、[内部テスト] ページに移動します。
  8. このページで [新しいリリースを作成] をクリックします。
  9. Google Play アプリ署名への同意を求められたら [次へ] をクリックします。
  10. [App Bundle と APK] パネルで、前の手順で生成した AAB ファイルをアップロードします。このファイルは、通常であればプロジェクトの app/prod/release または app/release ディレクトリにあります。[保存] をクリックします。

テスト プラグインをインストールする

Google アシスタント プラグインを使用すると、テストデバイスで App Actions をテストできます。テストでは、Android デバイスの Google アプリからアシスタントに情報を送信します。プラグインをまだインストールしていない場合は、次の手順でインストールします。

  1. [File] > [Settings](MacOS では [Android Studio] > [Preferences])に移動します。
  2. [Plugins] セクションで [Marketplace] に移動し、「Google Assistant」を検索します。手動でテストツールをダウンロードしてインストールすることもできます。
  3. ツールをインストールして Android Studio を再起動します。

デバイスでアプリをテストする

アプリに変更を加える前に、サンプルアプリで何ができるか確認しておくことをおすすめします。

テストデバイスでアプリを実行する手順は次のとおりです。

  1. Android Studio で実機または仮想デバイスを選択し、[Run] > [Run app] を選択するか、ツールバーの実行アイコン Android Studio のアプリ実行アイコン。 をクリックします。
  2. ホームボタンを長押ししてアシスタントをセットアップし、正常に動作することを確認します。デバイスでアシスタントにログインしていない場合はログインする必要があります。

Android Virtual Device の詳細については、仮想デバイスを作成して管理するをご覧ください。

アプリを動作させてみて、何ができるかを確認してください。最初の画面には、事前設定されている 10 種類のエクササイズ アクティビティが表示されます。

既存のウィジェットを試す

  1. [Home] ボタンをタップすると、テストデバイスのホーム画面に移動します。
  2. ホーム画面の空いているスペースを長押しして [Widgets] を選択します。
  3. ウィジェットのリストを下にスクロールして [FitActions] を探します。
  4. FitActions アイコンを長押しし、そのウィジェットをホーム画面に配置します。

デバイスのホーム画面に FitActions ウィジェットが表示されているスクリーンショット。

4. App Action を追加する

このステップでは、GET_EXERCISE_OBSERVATION BII ケーパビリティを追加します。そのためには、shortcuts.xml に新しい capability 要素を追加する必要があります。このケーパビリティで、ケーパビリティをトリガーする方法、BII パラメータの使用方法、リクエストに対応するためにどの Android インテントを呼び出すかを指定します。

  1. サンプル プロジェクトの shortcuts.xml リソースに新しい capability 要素を追加し、次のように構成します。
    <!-- fitnessactions/app/src/main/res/xml/shortcuts.xml -->
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
      <app-widget
        android:identifier="GET_EXERCISE_OBSERVATION"
        android:targetClass="com.devrel.android.fitactions.widgets.StatsWidgetProvider"
        android:targetPackage="PUT_YOUR_APPLICATION_ID_HERE">
        <parameter
          android:name="exerciseObservation.aboutExercise.name"
          android:key="aboutExerciseName"
          android:required="true">
        </parameter>
        <extra android:name="hasTts" android:value="true"/>
      </app-widget>
      <!-- Add Fallback Intent-->
    </capability>
    
    android:targetPackage の値 PUT_YOUR_APPLICATION_ID_HERE は、固有の applicationId で置き換えます。

このケーパビリティは、GET_EXERCISE_OBSERVATION BII を app-widget インテントにマッピングします。これで、BII がトリガーされるとウィジェットがインスタンス化されてユーザーに表示されます。

アシスタントは、ウィジェットをトリガーする前に、サポートされている BII パラメータをユーザークエリから抽出します。この Codelab では、ユーザーがリクエストしたエクササイズの種類を表す BII パラメータ exerciseObservation.aboutExercise.name が必要になります。アプリでサポートされているエクササイズは、「running」、「walking」、「cycling」の 3 種類です。サポートされている値をアシスタントに伝えるため、インライン インベントリを指定します。

  1. これらのインベントリ要素を定義するには、shortcuts.xmlGET_EXERCISE_OBSERVATION ケーパビリティの上に次の構成を追加します。
    <!-- shortcuts.xml -->
    
    <!-- shortcuts are bound to the GET_EXERCISE_OBSERVATION capability and
         represent the types of exercises supported by the app. -->
    
    <shortcut
      android:shortcutId="running"
      android:shortcutShortLabel="@string/activity_running">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/runningSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <shortcut
      android:shortcutId="walking"
      android:shortcutShortLabel="@string/activity_walking">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/walkingSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <shortcut
      android:shortcutId="cycling"
      android:shortcutShortLabel="@string/activity_cycling">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/cyclingSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
      <!-- ... -->
    </capability>
    

フォールバック インテントを追加する

フォールバック インテントは、ケーパビリティに必要なパラメータがユーザークエリに含まれておらず、クエリを実行できない場合に対処するためのものです。GET_EXERCISE_OBSERVATION ケーパビリティには、属性 android:required="true" で指定された exerciseObservation.aboutExercise.name パラメータが必要です。そこで、フォールバック インテントを定義して、クエリにパラメータが指定されていなくてもリクエストに対応できるようにしておく必要があります。

  1. 次の構成を使用して、shortcuts.xmlGET_EXERCISE_OBSERVATION ケーパビリティにフォールバック インテントを追加します。
    <!-- shortcuts.xml -->
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
    
      <app-widget>
        <!-- ... -->
      </app-widget>
    
      <!-- Fallback intent with no parameters needed to successfully execute.-->
      <intent
        android:identifier="GET_EXERCISE_OBSERVATION_FALLBACK"
        android:action="android.intent.action.VIEW"
        android:targetClass="com.devrel.android.fitactions.widgets.StatsWidgetProvider">
      </intent>
    </capability>
    

このサンプル構成では、フォールバック フルフィルメントが Extra データにパラメータのない Android インテントとして指定されています。

5. アシスタントのウィジェットを有効にする

GET_EXERCISE_OBSERVATION ケーパビリティが確立されたら、ウィジェット クラスを更新して App Actions の音声呼び出しがサポートされるようにします。

Widgets Extension ライブラリを追加する

App Actions の Widgets Extension ライブラリを使用すると、音声を主体とするアシスタントに対応できるようウィジェットを拡張できます。たとえば、この場合であれば案内用のカスタム TTS をウィジェットに提供できます。

  1. サンプルアプリの /app/build.gradle リソースに、Widgets Extension ライブラリの依存関係を追加します。
    // app/build.gradle
    
    dependencies {
      //...
      implementation "com.google.assistant.appactions:widgets:0.0.1"
    }
    
    Android Studio に警告が表示されたら、[Sync Now] をクリックします。build.gradle を変更するたびに同期しておくことで、アプリをビルドする際のエラーを回避できます。

ウィジェット サービスを追加する

サービスは、長時間実行オペレーションをバックグラウンドで実行できるアプリケーション コンポーネントです。アプリでは、ウィジェット リクエストを処理するサービスを提供する必要があります。

  1. サンプルアプリの AndroidManifest.xml リソースにサービスを追加し、次のように構成します。
    <!-- AndroidManifest.xml -->
    <service
       android:name=".widgets.StatsWidgetProvider"
       android:enabled="true"
       android:exported="true">
       <intent-filter>
           <action
               android:name="com.google.assistant.appactions.widgets.PIN_APP_WIDGET" />
       </intent-filter>
    </service>
    
    

アシスタントは、ウィジェットのフルフィルメントをトリガーする音声クエリ中に、このサービスを使用してアプリにリクエストを送信します。サービスは、リクエストと一緒に受信した BII データを使用して、アシスタント内でレンダリングする RemoteView ウィジェット オブジェクトを生成します。

ウィジェット クラスを更新する

これで、GET_EXERCISE_OBSERVATION ケーパビリティのリクエストがウィジェット クラスにルーティングされるようにアプリを構成できました。次は StatsWidget.kt クラスを更新し、BII パラメータの値を使用して、ユーザー リクエストに応じてカスタマイズされたウィジェット インスタンスが生成されるようにします。

  1. StatsWidget.kt クラスを開き、App Actions の Widget Extension ライブラリをインポートします。
    // StatsWidget.kt
    
    // ... Other import statements
    import com.google.assistant.appactions.widgets.AppActionsWidgetExtension
    
    
  2. 以下のプライベート変数を追加します。これらの変数は、ウィジェットに入力すべき情報を確認するときに使用します。
    // StatsWidget.kt
    
    private val hasBii: Boolean
    private val isFallbackIntent: Boolean
    private val aboutExerciseName: String
    private val exerciseType: FitActivity.Type
    
  3. init 関数を追加して、アシスタントから渡されたウィジェット オプション データをクラスで使用できるようにします。
    // StatsWidget.kt
    
    init {
      val optionsBundle = appWidgetManager.getAppWidgetOptions(appWidgetId)
      val bii = optionsBundle.getString(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_BII)
      hasBii = !bii.isNullOrBlank()
      val params = optionsBundle.getBundle(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_PARAMS)
    
      if (params != null) {
        isFallbackIntent = params.isEmpty
        if (isFallbackIntent) {
          aboutExerciseName = context.resources.getString(R.string.activity_unknown)
        } else {
            aboutExerciseName = params.get("aboutExerciseName") as String
          }
      } else {
          isFallbackIntent = false
          aboutExerciseName = context.resources.getString(R.string.activity_unknown)
      }
      exerciseType = FitActivity.Type.find(aboutExerciseName)
    }
    
    

これらの変更を加えることで、GET_EXERCISE_OBSERVATION ケーパビリティによって生成された Android インテントに StatsWidget.kt クラスが応答できるようになります。この仕組みについて順番に見ていきましょう。

  • optionsBundle = Bundle
    • Bundle は、プロセス境界(インテントのあるアクティビティ間)で使用し、構成変更前後の一時的な状態を格納することを目的とするオブジェクトです。アシスタントは、Bundle オブジェクトを使用して構成データをウィジェットに渡します。
  • bii = actions.intent.GET_EXERCISE_OBSERVATION
    • BII の名前は、AppActionsWidgetExtension を使用して Bundle から取得できます。
  • hasBii = true
    • BII があるかどうかをチェックします。
  • params = Bundle[{aboutExerciseName=running}]
    • App Actions によって生成された特別な Bundle は、ウィジェット オプションの Bundle 内にネストされています。Bundle には、BII の Key-Value ペアが格納されます。この例では、サンプルクエリ「OK Google, ExampleApp でランニングの統計情報を表示」から値 running が抽出されています。
  • isFallbackIntent = false
    • インテント Extras に必要な BII パラメータが存在するかどうかをチェックします。
  • aboutExerciseName = running
    • aboutExerciseName のインテント Extras の値を取得します。
  • exerciseType = RUNNING
    • aboutExerciseName を使用して、対応するデータベース タイプ オブジェクトを検索します。

これで、App Actions の Android インテント データの受信を StatsWidget クラスで処理できるようになりました。ウィジェットの作成フローのロジックを更新して、ウィジェットが App Actions によってトリガーされたかどうかを確認します。

  1. StatsWidget.kt で、updateAppWidget() 関数を次のコードで置き換えます。
    // StatsWidget.kt
    
    fun updateAppWidget() {
       /**
        * Checks for App Actions BII invocation and if BII parameter data is present.
        * If parameter data is missing, use data from last exercise recorded to the
        *  fitness tracking database.
        */
       if (hasBii && !isFallbackIntent) {
           observeAndUpdateRequestedExercise()
       } else observeAndUpdateLastExercise()
    }
    
    

上のコードでは、新しい関数 observeAndUpdateRequestedExercise を参照しています。この関数は、App Actions の Android インテントから渡された exerciseType パラメータ データを使用してウィジェット データを生成します。

  1. 次のコードを使用して observeAndUpdateRequestedExercise 関数を追加します。
    // StatsWidget.kt
    
    /**
    * Create and observe the last exerciseType activity LiveData.
    */
    private fun observeAndUpdateRequestedExercise() {
      val activityData = repository.getLastActivities(1, exerciseType)
    
       activityData.observeOnce { activitiesStat ->
           if (activitiesStat.isNotEmpty()) {
               formatDataAndSetWidget(activitiesStat[0])
               updateWidget()
           } else {
               setNoActivityDataWidget()
               updateWidget()
           }
       }
    }
    
    

上のコードでは、アプリ内で見つかった既存のリポジトリ クラスを使用して、アプリのローカル データベースからフィットネス データを取得しています。このクラスは、データベースへのアクセスを簡素化する API を提供します。リポジトリを使用するには、データベースに対してクエリを実行するときに、LiveData オブジェクトを公開する必要があります。コードでこの LiveData を監視することで、最新のフィットネス アクティビティを取得できます。

TTS を有効にする

ウィジェットを表示する際にアシスタントが読み上げる TTS 文字列を提供できます。この TTS を含めて、ウィジェットについて音声で案内できるようにすることをおすすめします。この機能は、App Actions の Widgets Extension ライブラリによって提供されます。このライブラリを使用して、アシスタント内でウィジェットと一緒に使用する案内用のテキストと TTS を設定できます。

案内用の TTS は、formatDataAndSetWidget 関数を使用して設定することをおすすめします。この関数を使用すると、アプリ データベースから返されたアクティビティ データをフォーマットできます。

  1. StatsWidget.kt で、formatDataAndSetWidget 関数に次のコードを追加します。
    // StatsWidget.kt
    
    private fun formatDataAndSetWidget(
      activityStat: FitActivity,
    ) {
          // ...
    
          // Add conditional for hasBii for widget with data
          if (hasBii) {
             // Formats TTS speech and display text for Assistant
             val speechText = context.getString(
                 R.string.widget_activity_speech,
                 activityExerciseTypeFormatted,
                 formattedDate,
                 durationInMin,
                 distanceInKm
             )
             val displayText = context.getString(
                 R.string.widget_activity_text,
                 activityExerciseTypeFormatted,
                 formattedDate
             )
             setTts(speechText, displayText)
          }
    }
    
    

上のコードでは、2 つの文字列リソース(音声用とテキスト用)を参照しています。TTS の推奨事項については、ウィジェットに関する動画の Text-to-Speech style recommendation をご覧ください。このサンプルでは、ウィジェット インスタンスに TTS 情報を提供する新しい関数 setTts も参照しています。

  1. 次のコードを使用して、setTts 関数を StatsWidget.kt に追加します。
    // StatsWidget.kt
    
    /**
     * Sets TTS to widget
     */
    private fun setTts(
      speechText: String,
      displayText: String,
    ) {
      val appActionsWidgetExtension: AppActionsWidgetExtension =
          AppActionsWidgetExtension.newBuilder(appWidgetManager)
            .setResponseSpeech(speechText)  // TTS to be played back to the user
            .setResponseText(displayText)  // Response text to be displayed in Assistant
            .build()
    
      // Update widget with TTS
      appActionsWidgetExtension.updateWidget(appWidgetId)
    }
    

最後に、エクササイズの種類のリクエストに対し、エクササイズ データベースからリクエスト空のデータが返された場合の TTS 情報を設定します。

  1. 次のコードを使用して、StatsWidget.ktsetNoActivityDataWidget() 関数を更新します。
    // StatsWidget.kt
    
    private fun setNoActivityDataWidget() {
      // ...
      // Add conditional for hasBii for widget without data
      if (hasBii) {
        // formats speech and display text for Assistant
        // https://developers.google.com/assistant/app/widgets#library
        val speechText =
          context.getString(R.string.widget_no_activity_speech, aboutExerciseName)
        val displayText =
          context.getString(R.string.widget_no_activity_text)
    
        setTts(speechText, displayText)
      }
    }
    

6. App Actions をテストする

開発中は、Google アシスタント プラグインを使用することで、アシスタントの App Actions をテストデバイスでプレビューできます。このツールで App Actions のインテント パラメータを調整し、ユーザーからアシスタントへのさまざまなリクエストをアクションがどう実行するかをテストできます。

プレビューを作成する

プラグインで App Actions をテストする手順は次のとおりです。

  1. [Tools] > [Google Assistant] > [App Actions Test Tool] に移動します。Android Studio へのログインを求められる場合があります。その場合は、前の手順で Google Play Console に使用したのと同じアカウントを使用してください。
  2. [Create Preview] をクリックしてプレビューを作成します。

想定されるエクササイズの種類をテストする

アプリで最後に完了したランニングの情報を表示するウィジェットを返すには、テストツールで次の手順を行います。

  1. ツールを開き、最初の手順で BII の選択と構成を求められたら actions.intent.GET_EXERCISE_OBSERVATION を選択します。
  2. [exerciseObservation] ボックスで、デフォルトのエクササイズ名を climbing から run に変更します。
  3. [Run App Action] をクリックします。

Google アシスタント プラグインによって返されたウィジェットが表示された画面。

想定外のエクササイズの種類をテストする

テストツールで、想定されていないエクササイズの種類をテストする手順は次のとおりです。

  1. [exerciseObservation] ボックスで、name の値を Run から Climbing に変更します。
  2. [Run App Action] をクリックします。

アシスタントから、「No activity found」という情報を含むウィジェットが返されるはずです。

Google アシスタント プラグインから返せるエクササイズ情報がない場合のウィジェットが表示された画面。

フォールバック インテントをテストする

フォールバック インテントをトリガーするクエリは、エクササイズの種類に関係なく、最後に記録されたアクティビティの情報を表示するウィジェットを返します。

フォールバック インテントをテストする手順は次のとおりです。

  1. [exerciseObservation] ボックスで、aboutExercise オブジェクトを削除します。
  2. [Run App Action] をクリックします。

アシスタントによって、最後に完了したエクササイズの情報を表示するウィジェットが返されるはずです。

Google アシスタント プラグインにより、最後に記録されたアクティビティのウィジェットが表示された画面。

7. 次のステップ

これで完了です。

アシスタントと Android ウィジェットを使用してユーザーのクエリに対応できるようになりました。

学習した内容

この Codelab では、以下について学びました。

  • BII にアプリ ウィジェットを追加する。
  • ウィジェットを変更し、Android の Extras からパラメータにアクセスできるようする。

次のステップ

ここで作成したフィットネス アプリをさらに改良できます。完成版のプロジェクトは、GitHub のメイン リポジトリで見ることができます。

App Actions を使用したアプリの拡張について詳しくは、以下を参照してください。

Actions on Google についてさらに詳しく知りたい場合は、以下のリソースをご覧ください。

Twitter で @ActionsOnGoogle をフォローして最新情報をチェックしてください。また、作成したアクションについて、ハッシュタグ #appactions でツイートしてください。

フィードバック アンケート

最後に、こちらのアンケートにご回答いただき、この Codelab に関するフィードバックをお送りください。