Android Auto と Android Automotive OS を搭載した車両で車内ディスプレイが普及するにつれ、デベロッパーは、駐車中はリッチでアダプティブなエクスペリエンスを提供し、運転中はドライバーの安全を確保するテンプレート駆動型のエクスペリエンスを提供するという、独自の二重の課題に直面しています。この 30 分間の包括的な技術セッションでは、Android アプリを自動車に適応させるためのエンドツーエンドのアーキテクチャと開発アプローチについて説明します。
車内で使用するアプリを設計するための基本から、車が走行から駐車に切り替わると音声から動画に切り替わるメディア エクスペリエンスを構築するための最新のアプローチまで、アプリを路上で利用できるようにするために必要なすべてのことを学ぶことができます。
文字起こし
それでは
皆さん、こんにちは。
「車はキャンバス」のセッションにご参加いただき、ありがとうございました。
このセッションでは、Android 開発を車載向けに展開する方法について説明します。
Paul Lammertsma です。
トーマス・ウェザーズです
私たちは、自動車向け Android チームのデベロッパー リレーションズ エンジニアです。
スマートフォン、折りたたみ式デバイス、タブレットなど、さまざまな画面やデバイスでアプリが適切に表示され、機能するように、多くの時間と労力を費やしてきた方も多いのではないでしょうか。
本日は、これまであまり意識したことがないかもしれない画面に焦点を当てていきます。
また、独自の方法でユーザーにリーチするのにも役立ちます。
車載ディスプレイです。
では、自動車向け Android の概要から始めましょう。
自動車向け Android は、1 つのモノリシックなものではありません。
ターゲットに設定できるプラットフォームは 2 つあります。
1 つ目は、スマートフォンをベースとした投影型システムの Android Auto です。
Android Auto では、アプリはスマートフォンで実行され、有線またはワイヤレス接続を使用して UI が車載ディスプレイに投影されます。
2 つ目は Android Automotive OS です。これは、車両自体で直接動作する Android のバリエーションです。
Android Automotive OS はスマートフォンとは独立して動作し、車両のハードウェア(エアコンやラジオなど)に直接アクセスします。また、重要な点として、独自のデータ接続を管理します。
Android Automotive OS を搭載した自動車の一部は、Google 搭載の自動車です。
Google 搭載の自動車には、Google Play ストア、Gemini、Google マップなどの Google のアプリやサービスも搭載されています。
プラットフォームは 2 つありますが、Google の目標は、1 回のビルドで両方のプラットフォームで優れたエクスペリエンスを提供するアプリを簡単にデプロイできるようにすることです。
自動車向けアプリ ライブラリを使用して作成されたメディアアプリの例と、Android Auto と Android Automotive OS の両方で、さまざまなディスプレイ サイズと形状でどのように表示されるかを示します。
開発対象となるデバイスやサーフェスには、さまざまな種類があります。
そこで、なぜ車なのかという疑問が生じます。
まず、ここでのスケールは非常に大きいです。
現在、Android Auto に対応した車は 2 億 5,000 万台以上、Google 搭載の自動車は 16 のブランドで 100 モデル以上あります。
アプリが車に搭載されていれば、毎日の通勤、家族での外出、用事、さらにはドライブ旅行でも、ユーザーにリーチできます。
米国では、AAA の 2024 年の American Driving Survey によると、ドライバーは 1 日平均 60 分間運転しています。
しかし、ユーザーが実際に運転しているときにだけリーチできるわけではありません。
また、駐車中のユーザーにもリーチできます。
たとえば、EV 充電スタンドで車を充電しているときや、学校の送迎の列に並んでいるときなどです。
また、助手席専用ディスプレイの普及に伴い、今後、ユーザーとのエンゲージメントを促進する機会がさらに増えると予想されます。
それでは
次に、自動車向けに構築できるさまざまなタイプのエクスペリエンスについて見ていきましょう。
自動車向けにアプリを構築する方法を理解するには、アプリが車内で実行されているときに存在する 2 つの主な状況と状態を理解することが役立ちます。
1 つ目は、運転中に使用するアプリです。
これらは、車両の走行中に使用できる、運転に最適化されたエクスペリエンスです。
これには、画面に表示されているカテゴリのアプリが含まれます。たとえば、オーディオ アプリ(通常はメディア、メッセージ、コミュニケーション アプリ、ナビゲーションなど)です。
運転に最適化されたエクスペリエンスは、注意散漫を防ぐための厳格な基準に準拠する必要があります。
車両の走行中に安全に使用できるようにアプリの UI を構築する方法については、特別な考慮事項があります。
運転に最適化されたアプリを構築する方法はいくつかあります。
この講演では、特に自動車向けアプリ ライブラリの使用に焦点を当てます。
これは、テンプレート化されたフレームワークを提供する Jetpack ライブラリのセットです。このフレームワークは、ドライバー向けに最適化されたユーザー インターフェースを提供するとともに、車内で使われるさまざまなハードウェア構成への適合にも対処します。
入力モダリティ、画面サイズ、アスペクト比などを考慮してください。
自動車向けに運転に最適化されたエクスペリエンスを構築する方法はこれだけではありませんが、この講演で取り上げるのは、自動車向け Android アプリ ライブラリを使用して構築する方法です。
これは、略して CAL と呼ばれることがよくあります。
先ほど説明したように、自動車向けアプリ ライブラリは、自動車内で使用するアプリの構築に役立つライブラリのセットです。
これは、テンプレート化されたフレームワークであり、ドライバー向けに最適化されたユーザー インターフェースを提供するとともに、さまざまなハードウェア構成への適合にも対処します。
また、アプリをビルドする際、Android Auto と Android Automotive OS のどちらが動作していても、さまざまな構成で問題なく動作することを確認できます。
CAL を使用して構築されたアプリは、このホスト クライアント アーキテクチャに依存できます。
ホストアプリ(Android Auto 自体、または Google 搭載の自動車の場合は Google Automotive App Host)は、システム レンダラです。
最終的に、ディスプレイにユーザーに表示する必要があるものを制御します。
そのため、アプリ デベロッパーが最終的にピクセルを描画することはありません。
代わりに、構造化データとそのデータ、およびデータの状態を自動車向けアプリ ライブラリ テンプレートに提供します。
このホストがデータを受け取り、安全に、安全基準に準拠した方法で、注意散漫防止の最適化が施されたレイアウトで描画します。
では、CAL 内のクラスと、アプリをビルドするために拡張する必要があるクラスを見ていきましょう。まずは CarAppService からです。
これは、ホストアプリがクライアント アプリと通信するためのエントリ ポイントとして機能する Android サービスのサブクラスです。その目的は、ホストがやり取りするセッション インスタンスを作成することです。
セッションは、車両の画面上で動作する、クライアント アプリのインスタンスと考えることができます。
他の Android コンポーネントと同じように、独自のライフサイクルがあり、セッションのインスタンスが存在している間に使用されるリソースの初期化や破棄ができます。
これは、CarAppService とセッションの間の 1 対多の関係です。
たとえば、CarAppService に 2 つのセッション インスタンスがあり、1 つはプライマリ ディスプレイ用、もう 1 つはクラスタ画面をサポートするナビゲーション アプリのクラスタ ディスプレイ用という場合があります。
たとえば、プライマリ ディスプレイとクラスタ ディスプレイを備えた車では、各ディスプレイが専用のセッションに関連付けられます。アプリ デベロッパーは、この方法でマルチディスプレイ車両をサポートできます。
セッション内では、画面インスタンスが、ホストアプリによってレンダリングされるユーザー インターフェースの生成を担います。
これらのユーザー インターフェースは、特定のレイアウト タイプ(グリッドやリストなど)をモデル化したテンプレート クラスで表されます。
各セッションは、アプリのさまざまな部分でユーザーフローを処理する画面インスタンスのスタックを管理します。セッションと同様に、画面にも利用可能な独自のライフサイクルがあります。
ただし、ホストが UI をレンダリングし、自動車向けアプリ ライブラリのテンプレートを使用しているからといって、厳しく制限されるわけでも、アプリをカスタマイズできないわけでもありません。
豊富なテンプレートとコンポーネントが用意されており、これらを組み合わせて、必要なエクスペリエンスを実現できます。
テンプレートには、Car App Library 内のあらゆる種類のアプリで使用できる汎用テンプレートと、ナビゲーションやスポットなど、特定のアプリ エクスペリエンスを対象とした専用テンプレートがあります。
運転に最適化されたエクスペリエンスの構築について詳しく説明する前に、車内でアプリを実行できるもう 1 つの状況、つまり駐車中の場合について説明します。
特定のカテゴリのアプリは、車両が駐車しているときにのみ使用できます。これには、動画アプリ、ゲーム、ブラウザなどが含まれます。
ただし、車両が走行していないときは、ドライバーの注意散漫に関するガイドラインは適用されず、既存のアダプティブ UI に沿ったエクスペリエンスを提供できます。
駐車中アプリはアクティビティ ベースであり、スマートフォンやタブレットなどの他のデバイスで使用されるアクティビティと類似しているか、同じです。駐車中アプリについては、次のセクションで詳しく説明します。
駐車時向けアプリのエクスペリエンスでは、既存のアダプティブ アクティビティを再利用しますが、マニフェスト宣言やディスプレイ カットアウトから、車が動き始めたときの再生の一時停止まで、満たす必要のある車固有の品質ガイドラインがまだあります。
この作業を自動化するために、Google は、公開停止中のアプリに関する新しい Android スキルをリリースしました。
始める前に、Android CLI がインストールされていることを確認してください。この短いリンクから確認できます。
設定が完了したら、android skills list を実行して、利用可能なスキルを確認します。
android skills list
android skills add android-for-cars-parked-appsAndroid 開発を次の段階に進めるために実際に使用できる、さまざまなスキルが多数あります。
特に自動車向け Android の場合は、android skills add android-for-cars-parked-apps を使用してエージェントのコンテキストにスキルを追加できます。
お気に入りの AI エージェントが何であれ、Android Auto または Android Automotive OS 用のマニフェストを構成するためのステップバイステップのガイダンスを提供します。車のウィンドウ インセットや「戻る」ナビゲーションなどの処理、ドライバーの注意散漫を防止するための再生制限の適用、さらに、動画、ゲーム、ブラウザアプリを Google Play に送信する前に監査することもできます。
自動車向けアプリの開発は、アプリのカテゴリという概念があるため、少し特殊です。
前述のとおり、運転中に使用できるアプリのカテゴリと、駐車中に使用できるアプリのカテゴリがあります。
ハイライト表示されているカテゴリは、運転中に使用できるカテゴリです。
一部のカテゴリには CAL と記載されています。これは自動車向けアプリ ライブラリのことで、このカテゴリのアプリは先ほど紹介したようなテンプレートを使用します。
これらについて簡単に説明します。詳しくは説明しません。
メディアアプリから始めましょう。これは動画ではなく音声を再生するアプリです。
これらを構築する方法は 2 つあります。
一番上の MediaBrowserService は、最もシンプルなオプションです。
デベロッパーはメタデータを提供するだけで、インフォテインメント画面のインターフェースが、車に最適化された方法で再生 UI とメディア ブラウザ UI のレンダリングをすべて処理します。
もう 1 つのオプションは、自動車向けアプリ ライブラリを使用してメディアアプリを構築することです。この方法では、メディアアプリのスタイルや表示方法をカスタマイズするための制御やオプションがさらに増えます。これについては、トーマスが後ほど詳しく説明します。
ナビゲーション アプリは、もちろん、ルートやターンバイターン方式の経路案内を提供する重要なユースケースです。
ライドシェア ドライバー アプリもこのカテゴリに分類されます。
POI アプリを使用すると、EV 充電器や駐車場など、近くの便利な場所を見つけることができます。
モノのインターネット(IoT)アプリを使用すると、外出先からスマート デバイスにアクセスできます(例: ホーム管理)。
天気アプリも利用可能で、リアルタイムのレーダー、暴風雨警報、地域ごとの天気予報などを提供できます。
最後に、コミュニケーションは、基本的な通知を車に拡張する、メッセージ アプリ、ビデオ通話アプリの 3 つのサブカテゴリに分類されます。
そして、駐車中カテゴリ(動画ストリーミング アプリ、ゲーム、ウェブブラウザ)があります。
また、数週間前から、すべてのデベロッパーが Android Auto と Android Automotive OS でゲームを公開できるようになりました。
これらのカテゴリには、[Open]、[In Beta]、[近日公開] と表示されているものがあります。
「オープン」とは、どのデベロッパーでもこのカテゴリのアプリを製品版に直接送信できることを意味します。
ベータ版とは、内部トラックまたはクローズド トラックに公開することはできますが、早期アクセス プログラムの一部として承認されない限り、製品版に公開することはできないことを意味します。
各カテゴリのドキュメントには、詳細情報と、お問い合わせフォームへのリンクが記載されています。
「近日公開」は、現時点ではサポートされていないものの、今後サポートする予定があるカテゴリです。
最終的な目標は、プラットフォームを統合することです。
Google は、デベロッパーがカテゴリに関係なく、一度作成すれば Android Auto と Android Automotive OS の両方に配信して、最大限のリーチを獲得できるようにしたいと考えています。
ここからは、Thomas がメディアについて説明します。
ご検討のほどよろしくお願い申し上げます。
ありがとうございます。
そこで、昨年、メディアアプリ向けの Car App Library バージョン 1.8 をリリースし、テンプレート化されたブラウジング UI とカスタム アクションを Android Auto に導入しました。
これには、左側に表示されているメディア再生テンプレートが含まれていました。
今年の I/O では、Car App Library 1.9 を通じて、よりブラウジングしやすい UI を導入しました。
CAL 1.9 がベータ版に移行したことで、Auto と Automotive OS の両方で主要な機能アップデートを利用できるようになりました。
主な機能としては、アプリ表現によるブランドのカスタマイズが挙げられます。これにより、安全ルールを維持しながら、ホストでレンダリングされるレイアウトで色と形状のトークンをカスタマイズできます。また、スポットライト セクション、コンパクトなリストアイテム、スクロール可能なチップ、永続的なミニプレーヤーなどの新しい UI コンポーネントも追加されています。
さらに、CAL 1.9 ではメディア テンプレートのサポートが AAOS に完全に拡張され、両方のエコシステムにわたる真のプラットフォーム統合が実現します。
自動車向けアプリ ライブラリの次期バージョン(CAL バージョン 10)が近日公開されます。
CAL バージョン 10 では、コミュニケーション アプリ向けのカスタム テンプレートが追加され、運転中の通話エクスペリエンスがより堅牢でカスタマイズされたものになります。
また、運転中の会話機能に特化した、新しいカテゴリのアプリとアプリ用テンプレートも含まれています。
最後に、Car App Library テンプレートを使用して、駐車から運転への移行をよりシームレスにするための機能がさらに開発されています。
他にもストーリーを公開する予定ですので、引き続きご期待ください。
自動車向けアプリ ライブラリの駐車から運転への移行機能を使用すると、アプリは停車中にモードを動的に切り替えて、状況に応じたコンテンツを表示し、運転中は自動車向けアプリ ライブラリのテンプレートにシームレスに戻ることができます。
主な用途としては、停車中にカスタマイズされた認証フローを提供したり、動画ポッドキャストやミュージック クリップのストリーミングなど、駐車中に専用のエクスペリエンスを有効にしたりすることが挙げられます。
これは、メディア再生テンプレートと直接統合されます。
そのため、車両が停止しているときは、ドライバーはアプリのネイティブ Android アクティビティに完全にアクセスでき、動画ストリーミングなどのリッチメディアを利用できます。
車がギアに入るとすぐに、注意散漫防止機能が作動します。これにより、アプリは Car App Library のメディア テンプレートに戻り、コンプライアンスを維持しながら、途切れることなくオーディオを再生できます。
私たちは、車内エクスペリエンスの変革期を迎えています。
メディアアプリは、従来のブラウジングと再生のインターフェースを超えて進化し、ドライバーと乗客の両方に、より豊かで没入感のあるインタラクティブな瞬間を提供したいと考えています。
ここからは、Media3 ライブラリを使用してネイティブ動画アクティビティを追加し、車が駐車状態に移行したときに再生を開始する方法の例を見ていきます。
まず、動画レンダリング サーフェスをバックグラウンド再生インスタンスに直接接続します。
override fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}このアクティビティ内で個別のメディア プレーヤーをインスタンス化するのではなく、Media3 メディア ライブラリ サービスなどのプライマリ サービス内で一元的な ExoPlayer またはメディア プレーヤーを維持し、音声ストリームと動画ストリームの両方を組み合わせて処理する必要があります。
そのため、移動中にアクティブなサービスがバインドされていない場合、プレーヤーは音声のみをデコードしますが、駐車中にドライバーが動画アクティビティを開いた場合は、レンダリング サーフェスを基盤となるサービス プレーヤーに直接アタッチする必要があります。
Media3 を使用すると、mediaController がプレーヤーをネイティブに実装するため、このように直接割り当てることができます。playerView は playerView.player を mediaController に直接設定します。
次に、ParkedOnlyOnClickListener を使用してネイティブ エントリ ポイントを登録します。
val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()このラッパーは、メディア再生インターフェースのヘッダーバー内にインテント トリガーを提供します。
そのため、動画再生を開始するアクションを含め、その選択リスナーを ParkedOnlyOnClickListener でラップします。
運転モードでは、これらのタップはホストアプリによってインターセプトされ、システムの安全メッセージが表示されます。そのため、運転中は該当の画面に移動できませんが、駐車中はコールバックによって carContext 内の startActivity がトリガーされ、指定された全画面アクティビティが起動します。
これらの自動車向けアプリ ライブラリ アプリでは、オペレーティング システムが駐車時のみのワークフローであることを認識できるように、マニフェスト内で動画ターゲットに distractionOptimized=false のフラグを設定する必要があります。
<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>最後に、ドライバーがシフトをパーキングからドライブに切り替えたときに何が起こるかを見てみましょう。
アクティビティが注意散漫防止の最適化に対応しておらず、車が動いている間もアクティブなままである場合、AAOS はシステム ブロッキング オーバーレイを表示し、アプリの使用を続けるには駐車するようユーザーに伝えます。
このブロックされた画面を回避するため、音声を中断することなく、メディア再生テンプレートにシームレスに戻ることを目標としています。
ここで isRequiresDistractionOptimization が true と評価されると、基本的には、基盤となるメディア セッションから動画レンダリング サーフェスをクリアし、Play アクティビティで finish を呼び出します。これは、CAL エクスペリエンスの上に起動されたため、終了するとメディア再生テンプレートに直接戻り、音声再生が続行されます。
class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}音声の再生を中断しないことは、優れたユーザー エクスペリエンスを実現するうえで重要です。メディア セッションをフォアグラウンド サービスとしてアクティブに保つことで、状態が変化しても音声はシームレスに再生され続けます。
<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>また、SHOW_MEDIA_PLAYBACK インテントをキャプチャするには、CAL 画面で onNewIntent をオーバーライドする必要があります。
class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}そうすることで、ユーザーが車のホーム画面にある車両システムのメディア ウィジェットを操作するたびに、ディープリンクによって Car アプリ ライブラリのこの曲なに?ビューに直接ルーティングされます。
そのため、開発プロセス全体でこれらの遷移を検証するのは非常に簡単です。
AAOS で adb コマンドを実行できます。
この場合、アクティビティを切り替える準備ができたら、emulate-driving-state drive または emulate-driving-state park になります。
これは、自動車向けアプリ ライブラリを使用して、駐車から運転への移行時に動画を再生する、新しいサンプル Media3 メディアアプリの例です。
この機能は、1 階のアダプティブ Android ブースと、GitHub の car-samples でまもなくご確認いただけます。
駐車から運転への切り替え機能は、現在、Android Automotive OS で利用できます。この機能は、運転中のエクスペリエンスのためにすでに自動車の CAL と統合されているメディアアプリ向けで、駐車中により充実したエクスペリエンスを提供できるようになります。
developer.android.com のドキュメントで近日中に公開される予定ですので、ぜひご確認ください。また、この機能をアプリに組み込むことに関心がある場合は、ぜひお知らせください。
Paul。
ありがとうございます。
ありがとうございます、Thomas。
最後に、今年後半に予定されている内容について詳しく知る方法をいくつかご紹介します。
Thomas が言及したように、CAL 1.9 は現在アルファ版です。
まもなくベータ版に移行する予定です。
また、CAL 1.10 は年内にアルファ版がリリースされる予定です。これにより、会話型 UI や、最新の通信機能、駐車から運転への切り替え機能を評価できるようになります。
最後に、先ほど申し上げたとおり、Android Auto と Android Automotive OS でゲームが利用可能になったことをお知らせいたします。今こそ、自動車向けにゲームタイトルを最適化する絶好の機会です。
実装の詳細については、「自動車向けゲームの作成」ガイドのドキュメントをご覧ください。
自動車向けにゲームを最適化する方法や、自動車向け Android のその他の新機能や変更点については、「新機能」ページをご覧ください。
自動車とそのユーザーがアプリに対応する準備が整っていることをご理解いただけたかと思います。
既存のアダプティブ アプリをベースに、駐車中のエクスペリエンスを充実させることができます。また、自動車向けアプリ ライブラリのさまざまなテンプレートを使用して、安全運転に最適化されたエクスペリエンスを作成することもできます。
公開する前に、デスクトップ ヘッドユニット、エミュレータ、Google Pixel Tablet で動作する AAOS、Firebase Test Lab を使用して、徹底的にテストできます。
このエコシステム向けに開発するスキルはすでに身についており、何百万台もの車がアプリを待っています。アプリをリリースしましょう。
android skills list
android skills add android-for-cars-parked-appsoverride fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}