自動車向け Android アプリ ライブラリは、ナビゲーション アプリ、駐車場アプリ、充電アプリを車で利用できるようにするためのライブラリです。ドライバーの注意散漫に関する基準に則して設計された一連のテンプレートのセットを提供し、さらに、さまざまな車の画面の要素や入力モダリティなどの細部も考慮されています。
このガイドでは、ライブラリの主な機能と概念について概説し、簡単なアプリをセットアップする手順を示します。
始める前に
- 自動車向け Android アプリ ライブラリの設計ガイドラインを確認してください。
- このセクションに記載されている主な用語と概念を確認してください。
- Android Auto システム UI について十分に理解しておいてください。
- リリースノートを確認してください。
- サンプルを確認してください。
- [クローズド ソース ライブラリのみ] 自動車向け Android アプリ ライブラリの利用規約を確認してください。
主な用語と概念
- モデルとテンプレート
- ユーザー インターフェースはモデル オブジェクトのグラフで表されます。モデル オブジェクトは、帰属するテンプレートで許可されているさまざまな方法で配置できます。テンプレートとは、これらのグラフでルートとして機能するモデルのサブセットです。モデルには、テキストや画像の形式でユーザーに表示される情報と、このような情報の見た目の各部分を構成する属性(テキストの色や画像サイズなど)が含まれています。ホストは、モデルを、ドライバーの注意散漫に関する基準に則したデザインのビューに変換し、さまざまな車の画面の要素や入力モダリティなど、詳細な処理を行います。
- ホスト
- ホストは、ライブラリの API によって提供される、アプリを車で実行するための機能を実装するバックエンド コンポーネントです。ホストは、アプリの検出とそのライフサイクルの管理、モデルのビューへの変換、ユーザー操作のアプリへの通知にいたるまで、幅広い役割を担います。モバイル デバイスでは、このホストは Android Auto によって実装されます。
- テンプレートの制限事項
- テンプレートに応じて、そのモデルのコンテンツに制限が課されます。たとえば、リスト テンプレートには、ユーザーに提示できるアイテムの数に制限があります。テンプレートには、タスクのフローを形成するためにテンプレートを接続する方法に対しても制限があります。たとえば、アプリが画面スタックにプッシュできるテンプレートは最大 5 つです。詳しくは、テンプレートの制限事項をご覧ください。
- 画面
Screen
は、ライブラリによって提供されるクラスであり、アプリはこのクラスを実装して、ユーザーに提示されるインターフェースを管理します。Screen
にはライフサイクルがあり、画面の表示時に表示されるテンプレートをアプリが送信するメカニズムを提供します。また、Screen
インスタンスを 画面スタックにプッシュ(push)し、ポップ(pop)して、テンプレート フローの制限事項に従わせることもできます 。
- CarAppService
CarAppService
は、抽象Service
クラスです。アプリがホストによって検出、管理されるためには、このクラスを実装し、エクスポートする必要があります。アプリのCarAppService
は、CarAppService.createHostValidator
を使用してホスト接続が信頼できることを検証し、次いで、CarAppService.onCreateSession
を使用して接続ごとにSession
インスタンスを提供します。- セッション
Session
は抽象クラスであり、アプリはCarAppService.onCreateSession
を使用してこのクラスを実装し、結果を返す必要があります。このクラスは、車の画面に情報を表示するためのエントリ ポイントとして機能し、車の画面にアプリの現在の状態(アプリが表示されているか、非表示になっているかなど)を通知するライフサイクルを持ちます。Session
が開始されると(アプリの初回起動時など)、ホストはSession.onCreateScreen
メソッドを使用して、最初のScreen
の表示をリクエストします。
ライブラリをインストールする
ライブラリをアプリに追加する方法については、Jetpack ライブラリのリリースページをご覧ください。
アプリのマニフェスト ファイルを構成する
自動車アプリを作成する前に、アプリのマニフェスト ファイルを構成する必要があります。
CarAppService を宣言する
ホストは CarAppService
の実装を通じてアプリに接続します。ホストがアプリを検出して接続できるようにするには、マニフェストでこのサービスを宣言する必要があります。
また、アプリのインテント フィルタの category
要素でアプリのカテゴリを宣言する必要もあります。この要素で許可される値については、サポートされているアプリのカテゴリの一覧をご覧ください。
次のコード スニペットは、マニフェストで駐車場アプリ用の自動車アプリサービスを宣言する方法を示しています。
<application>
...
<service
...
android:name=".MyCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService"/>
<category android:name="androidx.car.app.category.PARKING"/>
</intent-filter>
</service>
...
<application>
サポートされているアプリのカテゴリ
Android Auto 用のアプリが Play ストアに掲載されるためには、サポートされている自動車アプリのカテゴリに属している必要があります。アプリのカテゴリを宣言するには、自動車アプリサービスを宣言するときに、サポートされている次のカテゴリ値をインテント フィルタに 1 つ以上追加します。
androidx.car.app.category.NAVIGATION
: ターンバイターン方式のナビゲーションの経路を提供するアプリ。androidx.car.app.category.PARKING
: 駐車位置の検索に関連する機能を提供するアプリ。androidx.car.app.category.CHARGING
: 電気自動車充電スタンドの検索に関連する機能を提供するアプリ。
各カテゴリに属するアプリの詳細な説明と条件については、自動車向け Android アプリの品質をご覧ください。
アプリの名前とアイコンを指定する
ホストがシステム UI でアプリを表すために使用するアプリ名とアイコンを指定する必要があります。
以下のように、CarAppService
の label
要素と icon
要素を使用して、アプリを表すために使用されるアプリ名とアイコンを指定できます。
...
<service
android:name=".MyCarAppService"
android:exported="true"
android:label="@string/my_app_name"
android:icon="@drawable/my_app_icon">
...
</service>
...
service
要素でラベルまたはアイコンが宣言されていない場合、ホストはアプリに指定された値にフォールバックします。
自動車向けアプリの API レベル
自動車向けアプリ ライブラリでは独自に API レベルが定義されるため、ライブラリのどの機能が特定の車両のテンプレート ホストでサポートされているかを確認できます。
ホストでサポートされている、自動車向けアプリの最高の API レベルを取得するには、getCarAppApiLevel()
メソッドを使用します。
アプリでサポートされる自動車向けアプリの最小 API レベルは、AndroidManifest.xml
ファイルで次のように宣言する必要があります。
<manifest ...>
<application ...>
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="1"/>
</application>
</manifest>
下位互換性を維持し、機能を使用するために必要な最小 API レベルを宣言する方法については、RequiresCarApi
アノテーションのドキュメントをご覧ください。自動車向けアプリ ライブラリの特定の機能を使用するために必要な API レベルの定義については、CarAppApiLevels
のリファレンス ドキュメントをご確認ください。
CarAppService とセッションを作成する
アプリは、CarAppService
クラスを拡張し、CarAppService.onCreateSession
メソッドを実装する必要があります。このメソッドは、ホストへの現在の接続に対応する Session
インスタンスを返します。
Kotlin
class HelloWorldService : CarAppService() { ... override fun onCreateSession(): Session { return HelloWorldSession() } ... }
Java
public final class HelloWorldService extends CarAppService { ... @Override @NonNull public Session onCreateSession() { return new HelloWorldSession(); } ... }
Session
インスタンスは、アプリの初回起動時に使用される Screen
インスタンスを返す役割を担います。
Kotlin
class HelloWorldSession : Session() { ... override fun onCreateScreen(intent: Intent): Screen { return HelloWorldScreen() } ... }
Java
public final class HelloWorldSession extends Session { ... @Override @NonNull public Screen onCreateScreen(@NonNull Intent intent) { return new HelloWorldScreen(); } ... }
自動車アプリがアプリのホーム画面やランディング スクリーンではない画面から起動する必要があるシナリオ(ディープリンクの処理など)を処理する場合は、ScreenManager.push
を使用して、onCreateScreen
から戻る前に画面のバックスタックを事前に埋め込むことができます。事前に埋め込むことで、ユーザーはアプリによって表示された最初の画面から前の画面に戻ることができます。
起動画面を作成する
アプリに表示される画面を作成するには、Screen
クラスを拡張するクラスを定義し、Screen.onGetTemplate
メソッドを実装します。このメソッドは、車の画面に表示する UI の状態を表す Template
インスタンスを返します。
次のスニペットは、PaneTemplate
テンプレートを使用してシンプルな「Hello world!」文字列を表示する Screen
を宣言する方法を示しています。
Kotlin
class HelloWorldScreen(carContext: CarContext) : Screen(carContext) { override fun onGetTemplate(): Template { val row = Row.Builder().setTitle("Hello world!").build() val pane = Pane.Builder().addRow(row).build() return PaneTemplate.Builder(pane) .setHeaderAction(Action.APP_ICON) .build() } }
Java
public class HelloWorldScreen extends Screen { @NonNull @Override public Template onGetTemplate() { Row row = new Row.Builder().setTitle("Hello world!").build(); Pane pane = new Pane.Builder().addRow(row).build(); return new PaneTemplate.Builder(pane) .setHeaderAction(Action.APP_ICON) .build(); } }
CarContext クラス
CarContext
クラスは、Session
インスタンスと Screen
インスタンスからアクセスできる ContextWrapper
サブクラスです。画面スタックを管理する ScreenManager
、アプリの全般的な機能(ナビゲーション アプリで地図を描画する際の Surface
オブジェクトへのアクセスなど)を担う AppManager
、ターンバイターン方式のナビゲーション アプリでナビゲーション メタデータやその他のナビゲーション関連のイベントをホストに通信するために使用される NavigationManager
などの自動車サービスへのアクセスを提供します。ナビゲーション アプリで利用できるライブラリ機能の全リストについては、ナビゲーション テンプレートにアクセスするをご覧ください。
また、CarContext
は、車の画面の構成を使用してドローアブル リソースを読み込むことを許可する機能、インテントを使用して車内のアプリを起動する機能、ナビゲーション アプリがダークモードで地図を表示する必要があるかどうかを通知する機能なども提供します。
画面ナビゲーションを実装する
アプリでは通常、多くの画面が表示されます。各画面はさまざまなテンプレートを利用し、ユーザーの操作に応じて移り変わるインターフェースを表示します。
ScreenManager
クラスは、画面をプッシュしておく画面スタックを提供します。スタックの画面は、ユーザーが車の画面で戻るボタンを選択するか、ハードウェアの戻るボタン(一部の車で提供されています)を使用すると、自動的にポップします。
次のスニペットは、メッセージ テンプレートに、「戻る」というアクションと、これをユーザーが選択したときに新しい画面をプッシュするアクションを追加する方法を示しています。
Kotlin
val template = MessageTemplate.Builder("Hello world!") .setHeaderAction(Action.BACK) .addAction( Action.Builder() .setTitle("Next screen") .setOnClickListener { screenManager.push(NextScreen(carContext)) } .build()) .build()
Java
MessageTemplate template = new MessageTemplate.Builder("Hello world!") .setHeaderAction(Action.BACK) .addAction( new Action.Builder() .setTitle("Next screen") .setOnClickListener( () -> getScreenManager().push(new NextScreen(getCarContext()))) .build()) .build();
Action.BACK
オブジェクトは、自動的に ScreenManager.pop
を呼び出す標準的な Action
です。この動作は、CarContext
が提供する OnBackPressedDispatcher
インスタンスを使用してオーバーライドできます。
運転中にアプリの安全性を確保するため、画面スタックには最大 5 つまで画面を保持できます。詳しくは、テンプレートの制限事項をご覧ください。
テンプレートのコンテンツを更新する
アプリは、Screen.invalidate
メソッドを呼び出すことで、Screen
のコンテンツを無効化するようリクエストできます。次いで、ホストはアプリの Screen.onGetTemplate
メソッドにコールバックして、新しいコンテンツを含むテンプレートを取得します。
Screen
を更新するときに、新しいテンプレートがホストによってテンプレートの割り当てにカウントされないように、テンプレート内のどのコンテンツが更新可能かを把握することが重要です。
詳しくは、テンプレートの制限事項をご覧ください。
Screen
と、Screen.onGetTemplate
の実装を通じて返されるテンプレートのタイプとが 1 対 1 の関係でマッピングされるように、画面を構成することをおすすめします。
ユーザーとやり取りする
アプリは、モバイルアプリと同様のパターンを使用してユーザーとやり取りできます。
ユーザー入力を処理する
アプリは、適切なリスナーをそれらをサポートするモデルに渡すことで、ユーザー入力に応答できます。次のスニペットは、アプリのコードで定義されたメソッドにコールバックする OnClickListener
を設定する Action
モデルを作成する方法を示しています。
Kotlin
val action = Action.Builder() .setTitle("Navigate") .setOnClickListener(::onClickNavigate) .build()
Java
Action action = new Action.Builder() .setTitle("Navigate") .setOnClickListener(this::onClickNavigate) .build();
次に、onClickNavigate
メソッドは CarContext.startCarApp
メソッドを使用して、デフォルトのナビゲーション自動車アプリを起動します。
Kotlin
private fun onClickNavigate() { val intent = Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address)) carContext.startCarApp(intent) }
Java
private void onClickNavigate() { Intent intent = new Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address)); getCarContext().startCarApp(intent); }
ACTION_NAVIGATE
インテントの形式など、アプリの起動方法について詳しくは、インテントを使用して自動車アプリを起動するをご覧ください。
インタラクションの続きをモバイル デバイスで行うようにユーザーをガイドするアクションなど、特定のアクションは車がパーキング状態にあるときに限り許可されます。このようなアクションの実装には、ParkedOnlyOnClickListener
を使用します。車がパーキング状態にない場合、ホストはユーザーにメッセージを表示して、その状態ではアクションが許可されないことを示します。車がパーキング状態にある場合、コードは正常に実行されます。次のスニペットは、ParkedOnlyOnClickListener
を使用してモバイル デバイスで設定画面を開く方法を示しています。
Kotlin
val row = Row.Builder() .setTitle("Open Settings") .setOnClickListener(ParkedOnlyOnClickListener.create(::openSettingsOnPhone)) .build()
Java
Row row = new Row.Builder() .setTitle("Open Settings") .setOnClickListener(ParkedOnlyOnClickListener.create(this::openSettingsOnPhone)) .build();
通知を表示する
モバイル デバイスに送信された通知は、CarAppExtender
で拡張された場合にのみ車の画面に表示されます。コンテンツのタイトル、テキスト、アイコン、アクションなど、一部の通知属性は CarAppExtender
でも設定でき、車の画面に表示されるときは、この設定が通知の属性をオーバーライドします。
次のスニペットは、モバイル デバイスとは異なるタイトルで、通知を車の画面に送信する方法を示しています。
Kotlin
val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) .setContentTitle(titleOnThePhone) .extend( CarAppExtender.Builder() .setContentTitle(titleOnTheCar) ... .build()) .build()
Java
Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) .setContentTitle(titleOnThePhone) .extend( new CarAppExtender.Builder() .setContentTitle(titleOnTheCar) ... .build()) .build();
通知は、ユーザー インターフェースの次の部分に影響する場合があります。
- ヘッドアップ通知(HUN)がユーザーに表示されることがあります。
- 通知センターにエントリが追加されたり、必要に応じて、レールにバッジが表示されたりすることがあります。
- ナビゲーション アプリの場合、ターンバイターン通知の説明にあるように、レール ウィジェットに通知が表示されることがあります。
アプリでは、CarAppExtender
ドキュメントの説明のとおり、どのユーザー インターフェース要素に影響する通知にするかを、通知の優先度を使って構成できます。
NotificationCompat.Builder.setOnlyAlertOnce
を値 true
で呼び出した場合、優先度の高い通知は HUN として 1 回だけ表示されます。
自動車アプリの通知を設計する方法について詳しくは、通知をご覧ください。
トーストを表示する
次のスニペットに示すように、アプリで CarToast
を使用してトーストを表示できます。
Kotlin
CarToast.makeText(carContext, "Hello!", CarToast.LENGTH_SHORT).show()
Java
CarToast.makeText(getCarContext(), "Hello!", CarToast.LENGTH_SHORT).show();
権限をリクエストする
アプリが制限付きのデータやアクションにアクセスする必要がある場合(位置情報へのアクセスなど)、アプリには Android 権限の標準ルールも適用されます。権限をリクエストするには、CarContext.requestPermissions()
メソッドを使用します。Android Auto では、ユーザーの権限ダイアログがスマートフォンに表示されます。
標準 Android API ではなく CarContext.requestPermissions()
を使用すると、権限ダイアログを作成するだけのために独自の Activity
を起動しなくてよいというメリットがあります。今年の後半に Android Automotive OS のサポートが開始されれば、プラットフォームによって異なるフローを作成することなく、Android Auto と Android Automotive OS の両方で同じコードを使用できるようになります。
インテントを使用して自動車アプリを起動する
CarContext.startCarApp
メソッドを呼び出して、次のアクションのいずれかを実行できます。
- 電話アプリを開いて電話をかける。
- デフォルトのナビゲーション自動車アプリで、ターンバイターン方式のナビゲーションを開始する。
- インテントを使用して独自のアプリを起動する。
次の例は、駐車予約の詳細を表示する画面でアプリを開く、というアクションを含む通知を作成する方法を示しています。コンテンツ インテントを使用して通知インスタンスを拡張します。コンテンツ インテントには、アプリのアクションに対する明示的なインテントをラップした PendingIntent
が含まれます。
Kotlin
val notification = notificationBuilder ... .extend( CarAppExtender.Builder() .setContentIntent( PendingIntent.getBroadcast( context, ACTION_VIEW_PARKING_RESERVATION.hashCode(), Intent(ACTION_VIEW_PARKING_RESERVATION) .setComponent(ComponentName(context, MyNotificationReceiver::class.java)), 0)) .build())
Java
Notification notification = notificationBuilder ... .extend( new CarAppExtender.Builder() .setContentIntent( PendingIntent.getBroadcast( context, ACTION_VIEW_PARKING_RESERVATION.hashCode(), new Intent(ACTION_VIEW_PARKING_RESERVATION) .setComponent(new ComponentName(context, MyNotificationReceiver.class)), 0)) .build());
また、アプリは BroadcastReceiver
も宣言する必要があります。このクラスは、ユーザーが通知インターフェースで対応するアクションを選択すると、インテントを処理するために呼び出され、データ URI を含むインテントが記述されている CarContext.startCarApp
を呼び出します。
Kotlin
class MyNotificationReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val intentAction = intent.action if (ACTION_VIEW_PARKING_RESERVATION == intentAction) { CarContext.startCarApp( intent, Intent(Intent.ACTION_VIEW) .setComponent(ComponentName(context, MyCarAppService::class.java)) .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction))) } } }
Java
public class MyNotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); if (ACTION_VIEW_PARKING_RESERVATION.equals(intentAction)) { CarContext.startCarApp( intent, new Intent(Intent.ACTION_VIEW) .setComponent(new ComponentName(context, MyCarAppService.class)) .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction))); } } }
最後に、アプリの Session.onNewIntent
メソッドがこのインテントを処理し、駐車予約画面をスタックにプッシュします(予約画面がまだ一番上にない場合)。
Kotlin
override fun onNewIntent(intent: Intent) { val screenManager = carContext.getCarService(ScreenManager::class.java) val uri = intent.data if (uri != null && MY_URI_SCHEME == uri.scheme && MY_URI_HOST == uri.schemeSpecificPart && ACTION_VIEW_PARKING_RESERVATION == uri.fragment ) { val top = screenManager.top if (top !is ParkingReservationScreen) { screenManager.push(ParkingReservationScreen(carContext)) } } }
Java
@Override public void onNewIntent(@NonNull Intent intent) { ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class); Uri uri = intent.getData(); if (uri != null && MY_URI_SCHEME.equals(uri.getScheme()) && MY_URI_HOST.equals(uri.getSchemeSpecificPart()) && ACTION_VIEW_PARKING_RESERVATION.equals(uri.getFragment()) ) { Screen top = screenManager.getTop(); if (!(top instanceof ParkingReservationScreen)) { screenManager.push(new ParkingReservationScreen(getCarContext())); } } }
自動車アプリの通知処理方法について詳しくは、通知を表示するをご覧ください。
テンプレートの制限事項
ホストは、1 つのタスクに対して表示されるテンプレートの数を最大 5 つに制限します。これらの 5 つのテンプレートのうち、最後のテンプレートは、次のいずれかのタイプである必要があります。
なお、この制限はテンプレートの数には適用されますが、スタック内の Screen
インスタンスの数には適用されません。たとえば、画面 A でアプリが 2 つのテンプレートを送信し、次いで画面 B をプッシュした場合、アプリはあと 3 つのテンプレートを送信できます。これに対し、各画面が 1 つのテンプレートを送信するように構成されている場合、アプリは 5 つの画面インスタンスを ScreenManager
スタックにプッシュできます。
これらの制限については、テンプレートの更新、戻る操作、リセット操作など、特殊なケースがいくつかあります。
テンプレートの更新
特定のコンテンツの更新は、テンプレートの割り当てに対してカウントされません。一般に、アプリが新しいテンプレートをプッシュしても、そのタイプと、そこに含まれるメイン コンテンツが前のテンプレートと同じである限り、その新しいテンプレートは割り当てに対してカウントされません。たとえば、ListTemplate
内で行の切り替え状態を更新しても、割り当てに対するカウントは行われません。どのような種類のコンテンツ更新がテンプレートの更新としてカウントされるかについて詳しくは、個々のテンプレートのドキュメントをご覧ください。
戻る操作
1 つのタスク内でサブフローを有効にできるように、アプリが ScreenManager
スタックから Screen
をポップすると、ホストがこれを検出し、アプリの戻る操作後のテンプレート数に基づいて残りの割り当てを更新します。
たとえば、アプリが画面 A で 2 つのテンプレートを送信してから、画面 B をプッシュし、さらに 2 つのテンプレートを送信した場合、アプリの残りの割り当ては 1 つになります。アプリが画面 A に戻った場合、ホストは割り当てを 3 にリセットします。これは、アプリが 2 つのテンプレート分前に戻ったためです。
画面に戻るとき、アプリは、その画面で最後に送信したテンプレートと同じタイプのテンプレートを送信する必要があります。それ以外のテンプレート タイプを送信すると、エラーが発生します。ただし、戻る操作時にタイプが同じのままであれば、アプリは割り当てに影響を与えることなくテンプレートのコンテンツを自由に変更できます。
リセット操作
一部のテンプレートには、タスクの終了を示す特別なセマンティクスがあります。たとえば、NavigationTemplate
は、画面に継続して残り、ユーザーのための新しいターンバイターン方式の指示で更新される必要があるビューです。このテンプレートが使用されると、ホストはテンプレートの割り当てをリセットし、そのテンプレートを新しいタスクの最初のステップとして扱い、アプリで新しいタスクを開始できるようにします。ホスト上でリセットがトリガーされるテンプレートについては、個々のテンプレートのドキュメントをご覧ください。
ホストが通知アクションまたはランチャーからアプリを起動するインテントを受け取ると、割り当てもリセットされます。このメカニズムにより、アプリがバインドされてフォアグラウンドで実行されている場合でも、アプリは通知から新しいタスクフローを開始できます。
車の画面にアプリの通知を表示する方法について詳しくは、通知を表示するをご覧ください。また、通知アクションからアプリを起動する方法については、インテントを使用して自動車アプリを起動するをご覧ください。
ログインフローを追加する
アプリでユーザー ログイン中の操作を提供している場合は、自動車向けアプリの API レベル 2 以上で SignInTemplate
や LongMessageTemplate
などのテンプレートを使用して、車のヘッドユニットでアプリへのログインを処理できます。
SignInTemplate
を作成するには、SignInMethod
を定義する必要があります。自動車向けアプリ ライブラリは現在、次の 3 つの方法でのログインが可能です。
InputSignInMethod
を使用したユーザー名 / パスワードによるログインPinSignInMethod
を使用した PIN コードによるログイン。ユーザーはヘッドユニットに表示された PIN を使用して、スマートフォンからアカウントをリンクします。ProviderSignInMethod
を使用したプロバイダ ログイン(Google ログインなど)
たとえば、ユーザーのパスワードを収集するテンプレートを実装するには、まず InputCallback
を作成してユーザー入力の処理と検証を行います。
Kotlin
val callback = object : InputCallback { override fun onInputSubmitted(text: String) { // You will receive this callback when the user presses enter on the keyboard. } override fun onInputTextChanged(text: String) { // You will receive this callback as the user is typing. The update frequency is determined by the host. } }
Java
InputCallback callback = new InputCallback() { @Override public void onInputSubmitted(@NonNull String text) { // You will receive this callback when the user presses enter on the keyboard. } @Override public void onInputTextChanged(@NonNull String text) { // You will receive this callback as the user is typing. The update frequency is determined by the host. } };
InputSignInMethod
Builder
には InputCallback
が必要です。
Kotlin
val passwordInput = InputSignInMethod.Builder(callback) .setHint("Password") .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD) ... .build()
Java
InputSignInMethod passwordInput = new InputSignInMethod.Builder(callback) .setHint("Password") .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD) ... .build();
最後に、新しい InputSignInMethod
を使用して SignInTemplate
を作成します。
Kotlin
SignInTemplate.Builder(passwordInput) .setTitle("Sign in with username and password") .setInstructions("Enter your password") .setHeaderAction(Action.BACK) ... .build()
Java
new SignInTemplate.Builder(passwordInput) .setTitle("Sign in with username and password") .setInstructions("Enter your password") .setHeaderAction(Action.BACK) ... .build();
テキスト文字列のバリエーションを追加する
自動車の画面サイズに応じて、表示されるテキストの量は異なります。自動車向けアプリの API レベル 2 以上では、画面に合う最適なテキスト文字列のバリエーションを複数指定できます。テキストのバリエーションを使用できる場所を確認するには、CarText
を使用するテンプレートとコンポーネントを探してください。
テキスト文字列のバリエーションを CarText
に追加するには、CarText.Builder.addVariant()
メソッドを使用します。
Kotlin
val itemTitle = CarText.Builder("This is a very long string") .addVariant("Shorter string") ... .build()
Java
CarText itemTitle = new CarText.Builder("This is a very long string") .addVariant("Shorter string") ... .build();
たとえば、この CarText
を GridItem
のメインテキストとして使用できます。
Kotlin
GridItem.Builder() .addTitle(itemTitle) ... .build()
Java
new GridItem.Builder() .addTitle(itemTitle) ... build();
文字列は優先度の高い順(たとえば文字列が長い順)に追加します。ホストは車の画面上のスペースに応じて、適切な長さの文字列を選択します。
CarAppService、セッション、画面のライフサイクル
Session
クラスと Screen
クラスは、LifecycleOwner
インターフェースを実装します。ユーザーがアプリを操作すると、Session
オブジェクトと Screen
オブジェクトのライフサイクル コールバックが呼び出されます。次の図をご覧ください。
CarAppService とセッションのライフサイクル

Session
ライフサイクル。詳しくは、Session.getLifecycle
メソッドのドキュメントをご覧ください。
画面のライフサイクル

Screen
ライフサイクル。詳しくは、Screen.getLifecycle
のドキュメントをご覧ください。
テスト ライブラリ
自動車向け Android のテスト ライブラリは、テスト環境でのアプリの動作検証に使用できる補助クラスを提供します。たとえば、SessionController
を使用すると、ホストへの接続をシミュレートして、正しい Screen
と Template
が作成されて返されることを確認できます。
使用例については、サンプルをご覧ください。
自動車向け Android アプリ ライブラリに関する問題を報告する
ライブラリに問題が見つかった場合は、Google Issue Tracker を使用して報告します。問題テンプレートに必要な情報をすべて記入してください。
新しい問題を報告する前に、その問題がライブラリのリリースノートに記載されていないか、すでに問題リスト内で報告されていないかご確認ください。Issue Tracker 内で各問題の横にあるスターアイコンをクリックすると、問題を登録して投票することができます。詳細については、問題を登録する手順をご覧ください。