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

Wenn du deine App auf Android Automotive OS-Geräten bereitstellst, solltest du einige Besonderheiten des Formfaktors beachten. In diesem Leitfaden werden diese Überlegungen erläutert.

Vorhandene App in einem Android Automotive OS-Emulator testen

Wenn Sie mit der Entwicklung Ihrer App für Android Automotive OS beginnen möchten, testen Sie zuerst Ihre vorhandene App in einem Android Automotive OS-Emulator. Folgen Sie der Anleitung unter Test mit dem Android Automotive OS-Emulator, um einen Emulator einzurichten. Anschließend können Sie die App ausführen. Folgen Sie dazu der Anleitung unter App im Emulator ausführen.

Achten Sie beim Ausführen Ihrer App auf Kompatibilitätsprobleme, z. B.:

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

Manifestdatei der App konfigurieren

Wenn Sie Android Automotive OS-Geräte als Ziel festlegen möchten, muss Ihre App bestimmte Manifesteinträge enthalten. Nachdem du dich für den Vertrieb auf Android Automotive OS-Geräten entschieden hast, werden kompatible Apps von Google Play überprüft, um sicherzustellen, dass sie im Auto sicher verwendet werden können. Weitere Informationen finden Sie unter Android-Apps für Autos bereitstellen.

Erforderliche Android Automotive OS-Funktionen

Alle für Android Automotive OS entwickelten Apps müssen bestimmte Anforderungen erfüllen, um über Google Play vertrieben werden zu können. Weitere Informationen finden Sie unter Anforderungen für Google Play-Funktionen 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 den Ablenkungsgrad des Fahrers erfüllen

Wenn Sie Ihre App für Autos anbieten, ist es wichtig, dass Sie den Ablenkungsgrad des Fahrers vermeiden. Bei geparkten Apps wird dies in erster Linie dadurch erreicht, dass die App nicht verwendet oder Audio wiedergegeben werden kann, während Einschränkungen der User Experience (UX) aktiv sind, wie in den Qualitätsrichtlinien DD-2 und DD-3 beschrieben.

Nutzung verhindern, wenn Einschränkungen für die Nutzerfreundlichkeit aktiv sind

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

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

Wenn eine Aktivität in deiner 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-Lebenszyklus-Callback, bei dem du sowohl die Video- als auch die Audiowiedergabe deiner App pausieren musst.

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

Wiedergabe beenden und Fortsetzung der Wiedergabe verhindern

Bei einigen Apps reicht es aus, die Wiedergabe während onPause() zu pausieren und den Status zu verfolgen, um die Wiedergabe erst nach onResume() fortzusetzen, um die Anforderungen an den Ablenkungsgrad des Fahrers zu erfüllen.

Wenn das Reagieren auf Lebenszyklus-Callbacks für Ihre App nicht ausreicht, können Sie den Status der UX-Einschränkung direkt abhören, wie im folgenden Abschnitt beschrieben. Beispielsweise ist es bei Apps, die Bild im Bild unterstützen, möglicherweise besser, direkt zu warten, anstatt bedingte Prüfungen in Lebenszyklus-Callbacks durchzuführen.

Einschränkungen für die Nutzerfreundlichkeit anhören

Wenn Sie auf UX-Einschränkungen warten möchten, fügen Sie zuerst in der Datei build.gradle Ihres App-Moduls eine Abhängigkeit von der Bibliothek android.car hinzu. Dies ist eine Erweiterung des Android SDK, die APIs speziell 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 UX-Einschränkungsstatus anhand anderer Hardwarestatus wie Gang oder Geschwindigkeit zu ermitteln, da die UX-Einschränkungen innerhalb eines Fahrzeugs von Display zu Display 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 von CarUxRestrictions bereitgestellte Wert, auf den sich Ihre App bezieht, ist der Rückgabewert von isRequiresDistractionOptimization. Andere Werte sind nur für Aktivitäten relevant, die als ablenkungsoptimiert gekennzeichnet sind.

Implementierung testen

Prüfe anhand des folgenden Verfahrens, ob deine App die Anforderungen an den Ablenkungsgrad des Fahrers erfüllt:

  1. Installiere deine App auf einem System-Image ohne Google Play Store oder Kompatibilitätsmodus.
  2. Simulieren Sie eine Fahrt, während das App-Raster des Launchers geöffnet ist, und prüfen Sie, ob Ihre App geöffnet werden kann.
  3. Beenden Sie die Simulation der Fahrt, öffnen Sie die 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 deine App die Integration mit MediaSession unterstützt, verwende adb shell cmd media_session dispatch play und prüfe, ob die Wiedergabe nicht fortgesetzt wird.

App für Android Automotive OS optimieren

Beachte beim Entwickeln deiner App für Android Automotive OS Folgendes, um Nutzern im Auto die bestmögliche Erfahrung zu bieten:

Mit Fenstereinzügen und Display-Aussparungen arbeiten

Wie bei anderen Formfaktoren enthält Android Automotive OS System-UI-Elemente wie 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 möchten Sie jedoch, dass Ihre App die Systemleisten ausblendet, Inhalte dahinter zeichnet oder Inhalte in einer Display-Aussparung anzeigt, wie unter App-Layout innerhalb von Fenster-Insets beschrieben. Wenn Ihre App eine dieser Funktionen ausführt, finden Sie in den folgenden Abschnitten Informationen dazu, wie Sie dafür sorgen, dass Ihre App auf allen Android Automotive OS-Geräten gut funktioniert.

Systemleisten, immersiver Modus und randloses Rendering

Systemleisten in Autos können sich in Größe und Position von denen auf anderen Formfaktoren unterscheiden. Navigationsleisten können beispielsweise links, rechts oder unten auf dem Bildschirm positioniert werden. Selbst wenn es oben eine Statusleiste und unten eine Navigationsleiste gibt (wie bei den meisten Smartphones und Tablets), ist die Größe dieser Elemente in Autos wahrscheinlich viel größer.

Außerdem können OEMs mit Android Automotive OS festlegen, ob Apps die Systemleisten ein- oder ausblenden können, um den immersiven Modus zu aktivieren oder zu deaktivieren. Wenn OEMs beispielsweise verhindern, dass Apps die Systemleisten ausblenden, können sie dafür sorgen, dass die Fahrzeugsteuerung, z. B. die Klimaanlage, immer auf dem Bildschirm verfügbar ist. Wenn ein OEM verhindert hat, dass Apps die Systemleisten steuern, passiert nichts, wenn eine App die APIs WindowInsetsController (oder WindowInsetsControllerCompat) aufruft, um Systemleisten ein- oder auszublenden. Weitere Informationen dazu, wie Sie feststellen können, ob Ihre App die Insets ändern konnte, finden Sie in der Dokumentation zu show und hide.

Ebenso können OEMs festlegen, ob Apps die Farbe und Transparenz von Systemleisten festlegen können, damit die Leisten und die darin enthaltenen Elemente jederzeit gut sichtbar sind. Wenn Ihre App Inhalte im Vollbildmodus anzeigt, achten Sie darauf, dass nur unkritische Inhalte hinter Systemleisten angezeigt werden. Dieser Inhalt ist möglicherweise nicht sichtbar, wenn der OEM des Geräts verhindert, dass die Farbe oder Transparenz der Leisten festgelegt wird.

<!-- 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 im Edge-to-Edge-Modus ausgeführt wird, sollten Sie keine Annahmen über die Größe, Anzahl, den Typ oder die Position der Systemleisten treffen. Verwenden Sie stattdessen die WindowInsets-APIs, um den Inhalt Ihrer App relativ zu den Systemleisten zu positionieren. Weitere Informationen zur Verwendung dieser APIs finden Sie unter Inhalte in Ihrer App im Vollbildmodus anzeigen. Hartcodierte Padding-Werte werden für keinen Formfaktor empfohlen. In Autos funktionieren sie wahrscheinlich überhaupt nicht, 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: Android Automotive OS-Gerät mit einem Display, das auf der rechten Seite gebogen ist. Der grüne Bereich ist das sichere Rechteck, das sich nicht mit dem Begrenzungsrahmen der Display-Aussparung der Kurve überschneidet.

Wenn Ihre App nicht im Edge-to-Edge-Modus gerendert wird, müssen Sie nichts tun, damit sie im sicheren Bereich gerendert wird.

Wenn deine App randlos gerendert wird, kannst du festlegen, wie sie sich bei Display-Aussparungen verhalten soll. Dazu kannst du das Attribut android:windowLayoutInDisplayCutoutMode für das Design deiner App festlegen oder zur Laufzeit das Attribut layoutInDisplayCutoutMode des Fensters ändern.

Da sich die Arten von Display-Aussparungen auf Android Automotive OS-Geräten 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 deren Verhalten für die Aussparungen auf Mobilgeräten optimiert ist. Verwenden Sie stattdessen LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER oder LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS, um den Ausschnitt entweder immer zu vermeiden oder immer zu betreten. Wenn du dich für Letzteres entscheidest, findest du unter Display-Aussparungen unterstützen weitere Informationen zu den APIs für Display-Aussparungen.

Wenn Ihre App im Bereich der Display-Aussparung gerendert wird und Sie ein anderes Verhalten zwischen Android Automotive OS und Mobilgeräten 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. Autos bieten beispielsweise in der Regel keinen Zugriff auf Kameras. Außerdem ist nur ein Teil der Google Play-Dienste unter Android Automotive OS verfügbar. Weitere Informationen finden Sie unter Google Play-Dienste für Autos.

Mit der PackageManager.hasSystemFeature API können Sie prüfen, ob die App unter Android Automotive OS ausgeführt wird. Dazu prüfen Sie, ob das Feature FEATURE_AUTOMOTIVE vorhanden ist, wie im folgenden Beispiel gezeigt:

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 ermitteln, ob die App unter Android Automotive OS oder Android Auto ausgeführt wird oder ob sie überhaupt nicht mit einem Auto verbunden ist.

Folge für die Funktion „Bild im Bild“ den Best Practices, um zu prüfen, ob die Funktion verfügbar ist, und entsprechend zu reagieren.

Offline-Szenarien verarbeiten

Obwohl Autos immer häufiger mit dem Internet verbunden sind, sollten Apps auch ohne Internetverbindung funktionieren, z. B. in den folgenden Fällen:

  • Nutzer können mobile Daten, die im Rahmen eines Abopakets des Autoherstellers angeboten werden, 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 das WLAN zugunsten eines Mobilfunknetzes.

Sei darauf vorbereitet, diese Szenarien in deiner App zu bewältigen, indem du Funktionen, die vom Internetzugriff abhängen, schrittweise einschränkst, z. B. durch das Anbieten von Offline-Inhalten. Weitere Informationen finden Sie in den Best Practices zur Optimierung von Netzwerken.

Alternative Ressourcen verwenden

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