Unterstützung für Android Automotive OS zu Ihrer Park-App hinzufügen

Wenn Sie Ihre App für Android Automotive OS-Geräte anbieten, müssen Sie einige Besonderheiten dieses Formfaktors beachten. In diesem Leitfaden werden diese Überlegungen erläutert.

Vorhandene App mit einem Android Automotive OS-Emulator testen

Bevor Sie mit der Entwicklung Ihrer App für Android Automotive OS beginnen, sollten Sie Ihre vorhandene App mit einem Android Automotive OS-Emulator testen. Folgen Sie der Anleitung unter Test mit dem Android Automotive OS-Emulator, um einen Emulator einzurichten. Anschließend können Sie die App gemäß der Anleitung unter App auf dem Emulator ausführen ausführen.

Achten Sie beim Ausführen Ihrer App auf Kompatibilitätsprobleme wie die folgenden:

  • Infotainment-Displays haben eine feste Ausrichtung. Um die Qualitätsrichtlinien für Auto-Apps zu erfüllen, müssen Apps sowohl das Hoch- als auch das Querformat unterstützen.
  • APIs, die auf anderen Geräten verfügbar sind, sind möglicherweise nicht auf Android Automotive OS verfügbar. Einige Google Play-Dienste-APIs sind beispielsweise nicht für Android Automotive OS verfügbar. Weitere Informationen zum Beheben dieser Probleme finden Sie im Abschnitt Funktionen deaktivieren.

Manifestdatei der App konfigurieren

Wenn Sie Ihre App für Android Automotive OS-Geräte ausrichten möchten, muss sie bestimmte Manifesteinträge enthalten. Nachdem Sie die Verteilung auf Android Automotive OS-Geräte aktiviert haben, überprüft Google Play kompatible Apps, um sicherzustellen, dass sie für die Verwendung in einem Auto geeignet sind. Weitere Informationen finden Sie unter Android-Apps für Autos bereitstellen.

Erforderliche Android Automotive OS-Funktionen

Alle Apps, die für Android Automotive OS entwickelt wurden, müssen bestimmte Anforderungen erfüllen, um über Google Play vertrieben werden zu können. Weitere Informationen finden Sie unter Google Play-Funktionsanforderungen erfüllen.

Kategoriespezifische Manifesteinträge

Zusätzlich zu den oben genannten Anforderungen, die für alle geparkten Apps gelten, gibt es für die Kategorien „Video“ und „Spiele“ weitere Anforderungen:

Anforderungen an die Ablenkung des Fahrers erfüllen

Es ist wichtig, dass Fahrer nicht abgelenkt werden, wenn sie Ihre App im Auto verwenden. Bei geparkten Apps wird dies in erster Linie dadurch erreicht, dass die App nicht verwendet werden kann und keine Audioinhalte wiedergegeben werden, wenn Einschränkungen der Nutzerfreundlichkeit aktiv sind. Dies wird durch die Qualitätsrichtlinien DD-2 und DD-3 abgedeckt.

Verwendung verhindern, wenn Einschränkungen der Nutzerfreundlichkeit aktiv sind

Standardmäßig können Aktivitäten nicht verwendet oder gestartet werden, wenn UX-Einschränkungen aktiv sind. Damit dieses Verhalten auf Ihre App angewendet wird, darf sie das folgende <meta-data>-Element in keinem <activity>-Element in Ihrem Manifest enthalten:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Wenn eine Aktivität in Ihrer App fortgesetzt wird, während UX-Einschränkungen aktiv werden, wird sie durch eine Aktivität des Betriebssystems verdeckt.

Die Aktivität Ihrer App wechselt mindestens in den Lebenszyklusstatus „Pausiert“. Dies geschieht als onPause-Lifecycle-Callback, bei dem Sie die Video- und Audiowiedergabe in Ihrer App pausieren müssen.

Auf Geräten mit dem Android Automotive OS-Kompatibilitätsmodus führt die Systemblockierung dazu, dass die Aktivitäten Ihrer App über den Status Pausiert in den Status Beendet übergehen.

Wiedergabe beenden und verhindern, dass sie fortgesetzt wird

Bei einigen Apps reicht es aus, die Wiedergabe während onPause() zu pausieren und den Status zu verfolgen, um eine Wiederaufnahme der Wiedergabe bis onResume() zu verhindern, um die Anforderungen an die Ablenkung des Fahrers zu erfüllen.

Wenn das Reagieren auf Lebenszyklus-Callbacks für Ihre App nicht ausreicht, können Sie den UX-Einschränkungsstatus direkt abrufen, wie im folgenden Abschnitt beschrieben. Apps, die beispielsweise Bild-im-Bild unterstützen, sollten direkt auf Ereignisse reagieren, anstatt bedingte Prüfungen in Lebenszyklus-Callbacks zu verwenden.

Einschränkungen der Nutzerfreundlichkeit berücksichtigen

Wenn Sie UX-Einschränkungen berücksichtigen möchten, fügen Sie zuerst eine Abhängigkeit von der Bibliothek android.car in der Datei build.gradle Ihres App-Moduls hinzu. Dies ist eine Erweiterung des Android SDK, die APIs für Android Automotive OS bereitstellt.

android {
    ...
    useLibrary("android.car")
}

Verwenden Sie CarUxRestrictionsManager, um den Status der UX-Einschränkung zu lesen. Versuchen Sie nicht, den Status der UX-Einschränkung anhand anderer Hardwarestatus wie Gang oder Geschwindigkeit zu ermitteln, da UX-Einschränkungen je nach Display in einem Fahrzeug variieren können.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

Der einzige Wert, auf den sich Ihre App bezieht, ist der Rückgabewert von isRequiresDistractionOptimization.CarUxRestrictions Andere Werte sind nur für Aktivitäten relevant, die als „ablenkungsoptimiert“ gekennzeichnet sind.

Implementierung testen

Prüfen Sie mit der folgenden Vorgehensweise, ob Ihre App die Anforderungen bezüglich der Ablenkung von Autofahrern erfüllt:

  1. Installieren Sie Ihre App auf einem Systemimage ohne Google Play Store oder Kompatibilitätsmodus.
  2. Öffnen Sie das App-Raster des Launchers, simulieren Sie die Fahrt und prüfen Sie, ob Ihre App nicht geöffnet werden kann.
  3. Beenden Sie die Simulation der Autofahrt, öffnen Sie Ihre App auf einem Wiedergabebildschirm und starten Sie die Wiedergabe.
  4. Simulieren Sie die Fahrt noch einmal und prüfen Sie, ob die Wiedergabe pausiert wird.
    1. Wenn Ihre App die Integration mit MediaSession unterstützt, verwenden Sie adb shell cmd media_session dispatch play und prüfen Sie, ob die Wiedergabe nicht fortgesetzt wird.

App für Android Automotive OS optimieren

Damit Ihre Nutzer Ihre App in Autos optimal nutzen können, sollten Sie beim Entwickeln Ihrer App für Android Automotive OS Folgendes beachten:

Mit Fenstereinsätzen und Displayausschnitten arbeiten

Wie bei anderen Formfaktoren enthält Android Automotive OS Elemente der System-UI, z. B. Status- und Navigationsleisten, und unterstützt nicht rechteckige Displays.

Standardmäßig werden Apps in einem Bereich gerendert, der sich nicht mit Systemleisten oder Display-Aussparungen überschneidet. Möglicherweise soll in Ihrer App aber auch die Systemleiste ausgeblendet, Inhalte dahinter gerendert oder Inhalte in einer Display-Aussparung angezeigt werden. Weitere Informationen finden Sie unter App-Layout innerhalb von Fenstereinsetzungen. Wenn Ihre App eine dieser Aktionen ausführt, finden Sie in den folgenden Unterabschnitten Details dazu, wie Sie dafür sorgen können, dass Ihre App auf allen Android Automotive OS-Geräten gut funktioniert.

Systemleisten, immersiver Modus und randloses Rendern

Systemleisten in Autos können anders dimensioniert und positioniert sein als auf anderen Formfaktoren. Navigationsleisten können beispielsweise links, rechts oder unten auf dem Bildschirm positioniert sein. Selbst wenn oben eine Statusleiste und unten eine Navigationsleiste vorhanden sind (wie bei den meisten Smartphones und Tablets), sind diese Elemente in Autos wahrscheinlich viel größer.

Außerdem können OEMs mit Android Automotive OS steuern, ob Apps die Systemleisten ein- und ausblenden können, um in den Immersive-Modus zu wechseln und ihn zu verlassen. Wenn OEMs beispielsweise verhindern, dass Apps die Systemleisten ausblenden, können sie dafür sorgen, dass Fahrzeugsteuerungen wie die Klimaanlage immer auf dem Display verfügbar sind. Wenn ein OEM verhindert hat, dass Apps Systemleisten steuern, passiert nichts, wenn eine App die APIs WindowInsetsController (oder WindowInsetsControllerCompat) aufruft, um Systemleisten ein- oder auszublenden. In der Dokumentation zu show und hide finden Sie weitere Informationen dazu, wie Sie erkennen können, ob Ihre App die Insets ändern konnte.

Außerdem können OEMs festlegen, ob Apps die Farbe und Transparenz von Systemleisten festlegen dürfen, damit die Leisten und die darin enthaltenen Elemente jederzeit gut sichtbar sind. Wenn Ihre App randlos dargestellt wird, prüfen Sie, ob nur nicht kritische Inhalte hinter den Systemleisten dargestellt werden. Diese Inhalte sind möglicherweise nicht sichtbar, wenn der Geräte-OEM das Festlegen der Farbe oder Transparenz der Leisten verhindert.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Wenn Ihre App den gesamten Bildschirm einnimmt, sollten Sie keine Annahmen zur Größe, Anzahl, Art oder Position von Systemleisten treffen. Verwenden Sie stattdessen die APIs für Fenstereinsätze, um den Inhalt Ihrer App relativ zu den Systemleisten zu layouten. Weitere Informationen zur Verwendung dieser APIs finden Sie unter Inhalte in Ihrer App von Rand zu Rand anzeigen. Fest codierte Padding-Werte sind für keinen Formfaktor zu empfehlen. In Autos ist es jedoch wahrscheinlich, dass sie nicht funktionieren, um Inhalte im sicheren Bereich zu halten.

An unregelmäßig geformte Displays anpassen

Neben rechteckigen Displays können einige Fahrzeuge auch unregelmäßig geformte Bildschirme haben, wie in Abbildung 1 dargestellt:

Ein Android Automotive OS-Gerät mit einem Display, das auf der rechten Seite gebogen ist.
Abbildung 1: Ein Android Automotive OS-Gerät mit einem Display, das auf der rechten Seite gebogen ist. Die grüne Fläche ist das sichere Rechteck, das sich nicht mit dem Begrenzungsrahmen der Display-Aussparung der Kurve überschneidet.

Wenn Ihre App nicht randlos gerendert wird, müssen Sie nichts weiter tun, damit sie im sicheren Bereich gerendert wird.

Wenn Ihre App randlos gerendert wird, können Sie festlegen, wie sie sich in Bezug auf Displayausschnitte verhalten soll. Sie können dies mit Ressourcen erreichen, indem Sie das Attribut android:windowLayoutInDisplayCutoutMode für das Design Ihrer App festlegen oder zur Laufzeit, indem Sie das Attribut layoutInDisplayCutoutMode des Fensters ändern.

Da die Arten von Displayausschnitten auf Android Automotive OS-Geräten sich von denen auf Mobilgeräten unterscheiden, sollten Sie nicht LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT oder LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES verwenden, da ihr Verhalten für die Ausschnitte auf Mobilgeräten optimiert ist. Verwenden Sie stattdessen LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER oder LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS, um das Ausschnitt immer zu vermeiden oder immer zu verwenden. Wenn Sie sich für die zweite Option entscheiden, finden Sie unter Displayausschnitte unterstützen weitere Informationen zu den APIs, die mit Displayausschnitten zusammenhängen.

Wenn Ihre App im Bereich des Displayausschnitts gerendert wird und Sie ein anderes Verhalten für Android Automotive OS als für Mobilgeräte wünschen, finden Sie unter Funktionen deaktivieren eine Anleitung, wenn Ihre App dieses Verhalten zur Laufzeit festlegt, und unter Alternative Ressourcen verwenden, wenn Ihre App dieses Verhalten mithilfe von Ressourcendateien festlegt.

Features deaktivieren

Wenn Sie eine vorhandene mobile App für Android Automotive OS verfügbar machen, sind bestimmte Funktionen möglicherweise nicht relevant oder verfügbar. In Autos ist der Zugriff auf Kameras in der Regel nicht möglich. Außerdem ist nur eine Teilmenge der Google Play-Dienste unter Android Automotive OS verfügbar. Weitere Informationen finden Sie unter Google Play-Dienste für Autos.

Sie können die PackageManager.hasSystemFeature API verwenden, um zu erkennen, ob die App unter Android Automotive OS ausgeführt wird. Prüfen Sie dazu, ob das Feature FEATURE_AUTOMOTIVE vorhanden ist. Das folgende Beispiel zeigt, wie das geht:

val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
    // Enable or disable a given feature
}

Wenn Ihre App auch eine Android Auto-Komponente hat, können Sie alternativ die CarConnection API aus der Android for Cars App-Bibliothek verwenden, um zu erkennen, ob die App unter Android Automotive OS oder Android Auto ausgeführt wird oder ob sie überhaupt nicht mit einem Auto verbunden ist.

Für die Bild-im-Bild-Funktion (BiB) solltest du die etablierten Best Practices befolgen, um zu prüfen, ob die Funktion verfügbar ist, und entsprechend reagieren.

Offlineszenarien verarbeiten

Autos sind zwar zunehmend mit dem Internet verbunden, aber Apps sollten auch ohne Internetverbindung funktionieren, z. B. in den folgenden Fällen:

  • Nutzer können die im Rahmen eines Abopakets des Automobilherstellers angebotenen mobilen Daten deaktivieren.
  • Der Zugriff auf mobile Daten ist in bestimmten Gebieten möglicherweise eingeschränkt.
  • Autos mit WLAN-Funkmodulen befinden sich möglicherweise außerhalb der WLAN-Reichweite oder ein OEM deaktiviert WLAN zugunsten eines Mobilfunknetzes.

Bereiten Sie Ihre App auf diese Szenarien vor, indem Sie Funktionen, die von einem Internetzugang abhängig sind, auf elegante Weise deaktivieren, z. B. durch das Anbieten von Offlineinhalten. Weitere Informationen finden Sie unter Best Practices für die Optimierung der Netzwerkkommunikation.

Alternative Ressourcen verwenden

Damit Sie Ihre App für Autos anpassen können, können Sie den car-Ressourcenqualifizierer verwenden, um alternative Ressourcen bereitzustellen, wenn die App auf einem Android Automotive OS-Fahrzeug ausgeführt wird. Wenn Sie beispielsweise Dimensionsressourcen zum Speichern von Padding-Werten verwenden, können Sie für den car-Ressourcensatz einen größeren Wert verwenden, um die Touch-Ziele zu vergrößern.