Android ウィジェットを Google アシスタントと連携させる

1. 概要

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

App Actions を使用すれば、Google アシスタントに「OK Google, ExampleApp でランニングを開始」といった音声指示をすることで、アプリを起動して特定の機能へ直行する機能を提供できます。アシスタントにできることは、アプリの起動だけではありません。BII によっては、リクエストに応じてインタラクティブな Android ウィジェットを表示することも可能です。

ユーザーのクエリによってアプリの BII ケーパビリティ GET_EXERCISE_OBSERVATION がトリガーされ、それに対して Google アシスタントがウィジェットを表示している画面

作成する内容

この Codelab では、Google アシスタント経由のユーザー リクエストに対して Android ウィジェットを返す方法を解説します。また、以下の方法を学ぶことができます。

  • BII パラメータを使ってウィジェットをパーソナライズする
  • Google アシスタントを通してテキスト読み上げ(TTS: Text-To-Speech)によるウィジェットの案内音声を提供する
  • 組み込みインテントのリファレンスで、ウィジェットによるリクエスト解決(フルフィルメント)に対応している BII を確認する

前提条件

先へ進む前に、App Actions 開発に適した開発環境が揃っていることを確認しましょう。以下が必要です。

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

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

2. 仕組みを理解する

Google アシスタントは、自然言語理解(NLU)によってユーザーのリクエストを読み取り、合致するアシスタント BII(組み込みインテント)を選んで、該当 BII を実装するケーパビリティにマッピングします。アプリ側ではそのケーパビリティとインテントの対応関係を登録することになります。最後に Google アシスタントは、ケーパビリティが持つ情報を使ってアプリが生成した Android ウィジェットを表示して、ユーザーのリクエストを解決(フルフィル)します。

この Codelab では、BII「GET_EXERCISE_OBSERVATION」への対応を登録するケーパビリティを定義します。このケーパビリティでは、BII へのリクエストを解決するため、ウィジェット クラス「FitActions」に受け渡す Android インテントを生成するよう、Google アシスタントに指示します。このクラスを編集することで、Google アシスタントがユーザーに表示するパーソナライズされたウィジェットと、ユーザーに音声で伝える TTS による案内文を生成させることができます。

次の図は、このフローを模式的に示したものです。

Google アシスタントがウィジェットを使ってリクエストを解決する仕組みを示したフロー図

FitActions ウィジェット

サンプルアプリ FitActions には、ユーザーがホーム画面に追加できるワークアウト情報ウィジェットが用意されています。BII「GET_EXERCISE_OBSERVATION」をトリガーするユーザークエリを解決するなら、このウィジェットが有望な候補になります。

ウィジェットの仕組み

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

サンプルアプリではレシーバ「widgets.StatsWidgetProvider」が定義されており、このレシーバが 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() を使ってデフォルト値を提供する。

アプリを Google アシスタントに対応させる

この Codelab では、サンプルアプリに次の変更を加えて、App Actions の機能を処理できるようにします。

  1. BII ケーパビリティ「GET_EXERCISE_OBSERVATION」を、StatsWidget オブジェクトのインスタンスを返すように構成する
  2. StatsWidget クラスに変更を加え、App Actions の次のような機能を使用させる
    • BII パラメータを使って、ユーザーが「OK Google, ExampleApp でランニングのデータを表示」などの音声指示によってワークアウトの統計データを閲覧できるようにする
    • 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 を更新する

アプリのアプリケーション ID を更新すると、テストデバイス上のアプリが一意に識別され、Google Play Console にアプリをアップロードする場合に「パッケージ名の重複」エラーが発生するのを回避できます。アプリケーション ID を更新するには、app/build.gradle を開きます。

android {
...
  defaultConfig {
    applicationId "com.MYUNIQUENAME.android.fitactions"
    ...
  }
}

applicationId フィールドの「MYUNIQUENAME」は、独自の値に置き換えます。

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

Google アシスタント プラグインを使用すると、App Action の動作をテストデバイスで確認できます。プラグインは、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. ホームボタンを長押しして Google アシスタントをセットアップし、正しく機能することを確認します。デバイスで Google アシスタントにログインします(していなかった場合)。

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

アプリを少し操作して、何ができるのか確認してみましょう。最初の閲覧時には、アプリがあらかじめ用意した 10 種類のエクササイズが表示されます。

既存のウィジェットを試してみる

  1. テストデバイスでホームボタンをタップして、ホーム画面に移動します。
  2. ホーム画面の空白部分を長押しして、[ウィジェット] を選択します。
  3. ウィジェットの一覧をスクロールして FitActions を見つけます。
  4. FitActions のアイコンを長押しして、ホーム画面にウィジェットを配置します。

デバイスのホーム画面に FitActions のウィジェットを表示した状態のスクリーンショット。

4. App Action を追加する

このステップでは、BII ケーパビリティ「GET_EXERCISE_OBSERVATION」を追加します。具体的には、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 に置き換えてください。

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

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

  1. これらをインベントリ要素として定義するには、shortcuts.xml 内のケーパビリティ「GET_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.xml で、GET_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 ライブラリを使用すると、ウィジェットを拡張して、Google アシスタントを使った音声主体のエクスペリエンスを提供できます。具体的には、カスタム 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 に変更を加えるたびに同期(Sync)しておけば、アプリをビルドする際のエラー発生を避けやすくなります。

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

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

  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>
    
    

ウィジェットによる解決(フルフィルメント)をトリガーする音声クエリの実行中、Google アシスタントはこのサービスを使ってアプリにリクエストを送ります。サービスはリクエストとともに BII データを受け取り、そのデータを使って、Google アシスタント内でレンダリングする RemoteView ウィジェット オブジェクトを生成します。

ウィジェット クラスに変更を加える

ここまでの作業で、GET_EXERCISE_OBSERVATION ケーパビリティのリクエストをウィジェット クラスに転送するようにアプリを構成することができました。次は、StatsWidget.kt クラスに変更を加え、BII パラメータの値をもとに、ユーザーのリクエストに沿ってパーソナライズされたウィジェット インスタンスが生成されるようにします。

  1. StatsWidget.kt クラスを開き、App Actions の Widgets 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. Google アシスタントから渡されたウィジェット オプション データをクラスに使用させるため、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)
    }
    
    

これで StatsWidget.kt クラスは GET_EXERCISE_OBSERVATION ケーパビリティが生成する Android インテントに応答できるようになりました。どのような仕組みなのか、変更内容を個別に確認してみましょう。

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

流入する App Actions の Android インテント データを StatsWidget クラスが処理できるようになったので、次はウィジェット作成フローのロジックに変更を加え、ウィジェットが App Action によってトリガーされたものかどうかを確認させましょう。

  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 を有効にする

Google アシスタントがウィジェットを表示する際に読み上げるべき TTS 文字列を指定することが可能です。ウィジェットに音声でコンテキストを提供できるため、組み込むことをおすすめします。この機能は App Actions の Widgets Extension ライブラリによって提供されています。同ライブラリを使用すれば、Google アシスタント経由で表示するウィジェットに、テキストと 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 のチャプターをご覧ください)。また、setTts という新しい関数が参照されています。この関数は、ウィジェットのインスタンスに TTS 情報を提供する役割を持ちます。

  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 情報を指定すれば、TTS のロジックは完成です。

  1. StatsWidget.kt 内の setNoActivityDataWidget() 関数を次のように変更します。
    // 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 Action をテストする

Google アシスタント プラグインを使用すれば、開発中の Google アシスタント App Action をテストデバイスでプレビューできます。このツールは、各 App Action のインテント パラメータを調整して、ユーザーが Google アシスタントへのリクエスト時に使用するフレーズのさまざまなバリエーションに Action が対応できるかテストする際にも役立ちます。

プレビューを作成する

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

  1. [Tools] > [Google Assistant] > [App Actions Test Tool] を開きます。Android Studio に Google アカウントでログインするよう求められることがあります。
  2. [Create Preview] をクリックします。求められた場合は、App Actions のポリシーと利用規約を確認して同意します。

想定内のエクササイズ タイプをテストする

アプリで最後に記録したランニングの情報を表示したウィジェットを返すには、テストツールで次のように操作します。

  1. 最初の手順で BII を選択および構成することを求められたら、actions.intent.GET_EXERCISE_OBSERVATION を選択します。
  2. [exerciseObservation] ボックスで、デフォルトの Exercise 名を climbing から run に変更します。
  3. [Run App Action] をクリックします。

Google アシスタント プラグインを使って返されたウィジェットを表示している画面。

想定外のエクササイズ タイプをテストする

想定外のエクササイズ タイプをテストするには、テストツールで次のように操作します。

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

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

Google アシスタント プラグインを使って返されたウィジェットに、エクササイズ情報がない旨が表示されている画面。

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

フォールバック インテントをトリガーするクエリに対しては、エクササイズ タイプを問わず、最後に記録されたアクティビティの情報を表示したウィジェットが返されるはずです。

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

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

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

Google アシスタント プラグインを使って返されたウィジェットに、最後に記録されたアクティビティが表示されている画面

7. 次のステップ

おつかれさまでした!

これで、Google アシスタント経由のユーザーのクエリを Android ウィジェットで解決する方法を確認できました。

学習した内容

この Codelab では、以下の方法を学びました。

  • BII にアプリ ウィジェットを追加する
  • ウィジェットに変更を加え、Android Extras 由来のパラメータにアクセスさせる

この後は

サンプルのフィットネス アプリをさらに改良してみるのもおすすめです。完成状態のプロジェクトは、GitHub のメイン リポジトリから参照できます。

App Actions を使ったこのアプリの拡張についてさらに理解を深めるには、以下がおすすめです。

Actions on Google の世界をさらに深く理解したい方には、以下のリソースがおすすめです。

Twitter アカウント @ActionsOnGoogle で最新情報を発信していますので、よろしければフォローをお願いします。App Actions を使って作ったものは、ぜひハッシュタグ #appactions を付けてシェアしてみてください。

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

最後に、こちらのアンケートより、この Codelab についてのフィードバックをお聞かせいただければ幸いです。