音声操作で、ドライバーはハンドルから手を離したり道路から目をそらしたりせずにタスクを実行できます。自動車向けアプリの 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 に登録され、ユーザーがアシスタントから利用できるようになります。
- ユーザーがアシスタントをトリガーし、特定のアプリに対し音声でリクエストします。
- アシスタントが、事前トレーニング済みのモデル(BII)とリクエストを照合し、BII でサポートされているパラメータを抽出します。
- この例では、アシスタントは BII
GET_CHARGING_STATION
とクエリを照合し、位置情報パラメータ「SFO」を抽出して、位置情報を地理座標に変換します。 - アプリがこの BII のフルフィルメント定義を介してトリガーされます。
- アプリがフルフィルメントを処理し、ドライバーのインフォテインメント システムに充電スタンドのオプションが表示されます。
制限事項
自動車での App Actions の実装には次の制限事項が適用されます。
自動車用 App Actions のフルフィルメントには Android のディープリンクを使用する必要があります。App Actions のフルフィルメントについては、組み込みインテントのフルフィルメントの詳細を指定するをご覧ください。
自動車での実装では次の BII のみがサポートされます。
- 駐車場 -
GET_PARKING_FACILITY
- 充電 -
GET_CHARGING_STATION
- 駐車場 -
要件
App Actions 向けに自動車用アプリを準備する手順は次のとおりです。
インテントとフルフィルメントを決定する
App Actions を使って自動車向けアプリを音声対応にする最初のステップは、アプリがサポートするユーザーの音声コマンド、つまりインテントを決定することです。決定したら、インテントごとにフルフィルメントを定義し、アプリがどのようにリクエストを満たす必要があるかを指定します。
自動車用アプリがサポートするインテントの種類
App Actions は、組み込みインテント(BII)という事前トレーニング済みの音声モデルを提供します。この BII は、ユーザーが「OK Google」と話しかけたときにユーザーの音声コマンドを理解し、解釈することができます。音声リクエストに応答するには、アプリがサポートしている BII をアシスタントに対し宣言するだけです。たとえば、アプリで駐車場を探せるようにするには、BII
GET_PARKING_FACILITY
を実装します。また、アプリで電気自動車の充電スタンドを探せるようにするには、BIIGET_CHARGING_STATION
を実装します。アプリが各インテントを遂行する仕組み
アプリは、適切な画面でアプリ自体を起動することで音声リクエストを遂行します。App Actions は、ユーザー リクエストから抽出したパラメータをフルフィルメントに提供し、ユーザーのニーズに合わせてレスポンスを調整できるようにしています。
App Actions を統合する
フルフィルメント戦略を決定したら、次の手順に沿って自動車向けアプリを音声対応にします。
メイン アクティビティ
AndroidManifest.xml
を開き、Android ショートカットのサポートを宣言します。capability
ショートカット要素を使用して、アプリがサポートする BII をアシスタントに対して宣言します。詳しくは、ケーパビリティを追加するをご覧ください。<!-- AndroidManifest.xml -->
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />次に、
<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.CarAppActivity">
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="YOUR_SCHEME "
android:host="YOUR_HOST " />
</intent-filter>
</activity>アプリの
res/xml
ディレクトリにshortcuts.xml
ファイルがまだない場合は、新たに作成します。App Actions が Android ショートカットを使用する仕組みについて詳しくは、shortcuts.xml を作成するをご覧ください。shortcuts.xml
で、選択した BII のcapability
を実装します。次に、ネストされた<intent>
を追加してアプリのフルフィルメントを定義します。<!-- shortcuts.xml -->
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<capability android:name="actions.intent.GET_PARKING_FACILITY">
<intent>
<url-template
android:value="YOUR_SCHEME ://YOUR_HOST {?name,address,disambiguatingDescription,latitude,longitude}">
<!-- Facility name, e.g. "Googleplex" -->
<parameter
android:name="parkingFacility.name"
android:key="name"/>
<!-- Address, e.g. "1600 Amphitheatre Pkwy, Mountain View, CA 94043" -->
<parameter
android:name="parkingFacility.address"
android:key="address"/>
<!-- Disambiguate the type of service, e.g. "valet" -->
<parameter
android:name="parkingFacility.disambiguatingDescription"
android:key="disambiguatingDescription"/>
<!-- Latitude, e.g. "37.3861" -->
<parameter
android:name="parkingFacility.geo.latitude"
android:key="latitude"/>
<!-- Longitude, e.g. "-122.084" -->
<parameter
android:name="parkingFacility.geo.longitude"
android:key="longitude"/>
</intent>
</capability>
</shortcuts>最後に、App Actions フルフィルメントの入力を処理するように自動車向けアプリの
Session()
ロジックを更新します。以下に、Session.onCreateScreen()
とSession.onNewIntent()
のインテント処理の例を示します。onCreateScreen()
@Override
fun onCreateScreen(@NonNull intent: Intent): Screen {
if (intent.getData() != null) {
val uri: Uri = intent.getData()
// uri = "YOUR_SCHEME ://YOUR_HOST ?name=Levis%20center"
// Build your Templates with parsed uri parameters
...
}
}@Override
public Screen onCreateScreen(@NonNull Intent intent) {
if (intent.getData() != null) {
Uri uri = intent.getData();
// uri = "YOUR_SCHEME ://YOUR_HOST ?name=Levis%20center"
// Build your Templates with parsed uri parameters
...
}
}onNewIntent()
@Override
fun onNewIntent(@NonNull intent: Intent): Screen {
if (intent.getData() != null) {
val uri: Uri = intent.getData()
// uri = "YOUR_SCHEME ://YOUR_HOST ?name=Levis%20center"
// Build your Templates with parsed uri parameters
...
}
}@Override
public void onNewIntent(@NonNull Intent intent) {
if (intent.getData() != null) {
Uri uri = intent.getData();
// uri = "YOUR_SCHEME ://YOUR_HOST ?name=Levis%20center"
// Build your Templates with parsed uri parameters
...
}
}
アプリをプレビュー、テスト、公開する
App Actions には、アプリのプレビューとテストを行うためのツールが用意されています。このツール、および音声対応の自動車向けアプリを Play ストアに公開する方法について詳しくは、App Actions の概要をご覧ください。