1. 概要
1 つ目の App Actions Codelab では、Google アシスタントを Android アプリへと拡張する方法を学ぶため、サンプルのフィットネス アプリに、Health and Fitness カテゴリの組み込みインテント(BII: Built-in Intent)を実装してみました。
App Actions を使用すれば、Google アシスタントに「OK Google, ExampleApp でランニングを開始」といった音声指示をすることで、アプリを起動して特定の機能へ直行する機能を提供できます。アシスタントにできることは、アプリの起動だけではありません。BII によっては、リクエストに応じてインタラクティブな Android ウィジェットを表示することも可能です。
作成する内容
この 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 による案内文を生成させることができます。
次の図は、このフローを模式的に示したものです。
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 の機能を処理できるようにします。
- BII ケーパビリティ「
GET_EXERCISE_OBSERVATION
」を、StatsWidget
オブジェクトのインスタンスを返すように構成する 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 で開きます。
- [Welcome to Android Studio] ダイアログで、[Import project] をクリックします。
- リポジトリのクローンを作成したフォルダを見つけ、選択します。
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 アプリからアシスタントに情報を送信します。プラグインのインストールがまだであれば、ここで済ませます。手順は次のとおりです。
- [File] > [Settings](macOS では [Android Studio] > [Preferences])に移動します。
- [Plugins] セクションで [Marketplace] に移動して「Google Assistant」を検索します。テストツールを手動でダウンロードしてインストールすることも可能です。
- ツールをインストールして Android Studio を再起動します。
デバイスでアプリをテストする
アプリの編集をさらに進める前に、サンプルアプリでどんなことができるのか把握しておくといいでしょう。
テストデバイスでアプリを実行します。
- Android Studio で、使用するデバイス(実機または仮想デバイス)を選択して、[Run] > [Run app] を選択するか、ツールバーの実行ボタン(
)をクリックします。
- ホームボタンを長押しして Google アシスタントをセットアップし、正しく機能することを確認します。デバイスで Google アシスタントにログインします(していなかった場合)。
Android Virtual Device について詳しくは、仮想デバイスを作成して管理するをご覧ください。
アプリを少し操作して、何ができるのか確認してみましょう。最初の閲覧時には、アプリがあらかじめ用意した 10 種類のエクササイズが表示されます。
既存のウィジェットを試してみる
- テストデバイスでホームボタンをタップして、ホーム画面に移動します。
- ホーム画面の空白部分を長押しして、[ウィジェット] を選択します。
- ウィジェットの一覧をスクロールして FitActions を見つけます。
- FitActions のアイコンを長押しして、ホーム画面にウィジェットを配置します。
4. App Action を追加する
このステップでは、BII ケーパビリティ「GET_EXERCISE_OBSERVATION
」を追加します。具体的には、shortcuts.xml
に新しい capability
要素を追加することになります。このケーパビリティでは、ケーパビリティ自体のトリガー方法、各 BII パラメータの使用方法、リクエスト解決のために呼び出すべき Android インテントの種類を指定します。
- サンプル プロジェクトの
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 アシスタントに伝えるため、インライン インベントリを用意しましょう。
- これらをインベントリ要素として定義するには、
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
パラメータが必須です。こういった場合、必要なパラメータがクエリに含まれていなくてもリクエストが成功するよう、フォールバック インテントを定義しておくことが求められます。
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 によるウィジェットの案内音声を提供可能です。
- サンプルアプリの
/app/build.gradle
リソースに、依存先として Widgets Extension ライブラリを追加します。 Android Studio で表示された警告ボックスの [Sync Now] をクリックします。// app/build.gradle dependencies { //... implementation "com.google.assistant.appactions:widgets:0.0.1" }
build.gradle
に変更を加えるたびに同期(Sync)しておけば、アプリをビルドする際のエラー発生を避けやすくなります。
ウィジェット サービスを追加する
サービスとは、長時間実行オペレーションをバックグラウンドで実行できるアプリケーション コンポーネントです。ウィジェット リクエストを処理するには、アプリがサービスを提供する必要があります。
- サンプルアプリの
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 パラメータの値をもとに、ユーザーのリクエストに沿ってパーソナライズされたウィジェット インスタンスが生成されるようにします。
StatsWidget.kt
クラスを開き、App Actions の Widgets Extension ライブラリをインポートします。// StatsWidget.kt // ... Other import statements import com.google.assistant.appactions.widgets.AppActionsWidgetExtension
- 次のプライベート変数を追加します。これらは、ウィジェットに渡すべき情報を判断するのに使用します。
// StatsWidget.kt private val hasBii: Boolean private val isFallbackIntent: Boolean private val aboutExerciseName: String private val exerciseType: FitActivity.Type
- 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
オブジェクトを使用します。
- バンドル(Bundle)とは、プロセスの境界をまたいで、あるいはアクティビティとインテントの間で使用したり、構成変更の前後で一時的なステータス情報を保持するのに使ったりするオブジェクトです。Google アシスタントは、構成データをウィジェットに渡す際に
bii
=actions.intent.GET_EXERCISE_OBSERVATION
- BII の名称は、
AppActionsWidgetExtension
を使ってバンドルから取得できます。
- BII の名称は、
hasBii
=true
- BII があるかどうか確認しています。
params
=Bundle[{aboutExerciseName=running}]
- App Actions が生成した特殊なバンドルが、ウィジェット オプション
Bundle
内にネストされています。このバンドルには、BII の Key-Value ペアが格納されています。ここでは、サンプルクエリ「OK Google, ExampleApp でランニングのデータを表示」から、running
という値が抽出されています。
- App Actions が生成した特殊なバンドルが、ウィジェット オプション
isFallbackIntent
=false
- インテント
Extras
内に、必須の BII パラメータがあるかどうか確認しています。
- インテント
aboutExerciseName
=running
- インテント
Extras
が持つaboutExerciseName
の値を取得しています。
- インテント
exerciseType
=RUNNING
aboutExerciseName
を使用して、対応するデータベース タイプ オブジェクトをルックアップしています。
流入する App Actions の Android インテント データを StatsWidget
クラスが処理できるようになったので、次はウィジェット作成フローのロジックに変更を加え、ウィジェットが App Action によってトリガーされたものかどうかを確認させましょう。
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
パラメータのデータを使ってウィジェット データを生成します。
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
関数内で指定するといいでしょう。
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 情報を提供する役割を持ちます。
- 上記の新しい関数
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 のロジックは完成です。
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 をプラグインでテストする手順は次のとおりです。
- [Tools] > [Google Assistant] > [App Actions Test Tool] を開きます。Android Studio に Google アカウントでログインするよう求められることがあります。
- [Create Preview] をクリックします。求められた場合は、App Actions のポリシーと利用規約を確認して同意します。
想定内のエクササイズ タイプをテストする
アプリで最後に記録したランニングの情報を表示したウィジェットを返すには、テストツールで次のように操作します。
- 最初の手順で BII を選択および構成することを求められたら、
actions.intent.GET_EXERCISE_OBSERVATION
を選択します。 - [exerciseObservation] ボックスで、デフォルトの Exercise 名を
climbing
からrun
に変更します。 - [Run App Action] をクリックします。
想定外のエクササイズ タイプをテストする
想定外のエクササイズ タイプをテストするには、テストツールで次のように操作します。
- [exerciseObservation] ボックスで、
name
値をRun
からClimbing
に変更します。 - [Run App Action] をクリックします。
Google アシスタントから、「No activity found」という情報を表示したウィジェットが返されるはずです。
フォールバック インテントをテストする
フォールバック インテントをトリガーするクエリに対しては、エクササイズ タイプを問わず、最後に記録されたアクティビティの情報を表示したウィジェットが返されるはずです。
フォールバック インテントをテストする手順は次のとおりです。
- [exerciseObservation] ボックスで、
aboutExercise
オブジェクトを削除します。 - [Run App Action] をクリックします。
Google アシスタントから、最後に完了したエクササイズの情報を表示したウィジェットが返されるはずです。
7. 次のステップ
おつかれさまでした!
これで、Google アシスタント経由のユーザーのクエリを Android ウィジェットで解決する方法を確認できました。
学習した内容
この Codelab では、以下の方法を学びました。
- BII にアプリ ウィジェットを追加する
- ウィジェットに変更を加え、Android Extras 由来のパラメータにアクセスさせる
この後は
サンプルのフィットネス アプリをさらに改良してみるのもおすすめです。完成状態のプロジェクトは、GitHub のメイン リポジトリから参照できます。
App Actions を使ったこのアプリの拡張についてさらに理解を深めるには、以下がおすすめです。
- アプリを Google アシスタントへと拡張する方法は、他にも豊富に用意されています。App Actions の組み込みインテントのリファレンスで確認してみましょう。
Actions on Google の世界をさらに深く理解したい方には、以下のリソースがおすすめです。
- developers.google.com/assistant/app: Google アシスタント App Actions の公式ドキュメント サイト。
- App Actions のサンプル インデックス: App Actions の機能を理解するのに役立つサンプルアプリとサンプルコード。
- Actions on Google の GitHub リポジトリ: サンプルコードとライブラリ。
- r/GoogleAssistantDev: Google アシスタントに取り組むデベロッパーを対象とした Reddit 公式コミュニティ。
Twitter アカウント @ActionsOnGoogle で最新情報を発信していますので、よろしければフォローをお願いします。App Actions を使って作ったものは、ぜひハッシュタグ #appactions を付けてシェアしてみてください。
フィードバック アンケート
最後に、こちらのアンケートより、この Codelab についてのフィードバックをお聞かせいただければ幸いです。