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

Wenn Sie Ihre App auf Android Automotive OS-Geräten anbieten, sollten Sie einige Besonderheiten des Formfaktors beachten. In diesem Leitfaden werden diese Aspekte erläutert.

Vorhandene App in einem Android Automotive OS-Emulator testen

Bevor Sie mit dem Erstellen Ihrer App für Android Automotive OS beginnen, sollten Sie Ihre vorhandene App zuerst auf einem Android Automotive OS-Emulator testen. Folgen Sie der Anleitung unter Mit dem Android Automotive OS-Emulator testen, um einen Emulator einzurichten. Führen Sie die App aus. Folgen Sie dazu der Anleitung unter App im Emulator ausführen.

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

  • Infotainment-Bildschirme 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 Umständen nicht auf Android Automotive OS verfügbar. Einige APIs von Google Play-Diensten sind beispielsweise unter Android Automotive OS nicht verfügbar. Weitere Informationen finden Sie im Abschnitt Funktionen deaktivieren.

Manifestdatei Ihrer App konfigurieren

Damit Ihre App auf Android Automotive OS-Geräte ausgerichtet werden kann, muss sie bestimmte Manifesteinträge enthalten. Nachdem Sie die Bereitstellung auf Android Automotive OS-Geräten aktiviert haben, werden kompatible Apps manuell geprüft, um sicherzustellen, dass sie für die Nutzung im Auto sicher sind. Weitere Informationen finden Sie unter Für Autos verbreiten.

Erforderliche Android Automotive OS-Funktionen

Alle für Android Automotive OS entwickelten Apps müssen bestimmte Anforderungen erfüllen, um über Google Play vertrieben zu werden. Weitere Informationen finden Sie unter Anforderungen an Google Play-Funktionen erfüllen.

Kategoriespezifische Manifesteinträge

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

Anforderungen an die Ablenkung von Fahrern erfüllen

Wenn Sie Ihre App für Autos entwickeln, ist es wichtig, dass Sie die Fahrer nicht ablenken. Bei inaktiv gesetzten Apps wird dies hauptsächlich dadurch verhindert, dass die App nicht verwendet oder Audio nicht wiedergegeben werden kann, während Einschränkungen für die Nutzererfahrung aktiv sind, wie in den Qualitätsrichtlinien DD-2 und DD-3 beschrieben.

Verwendung verhindern, während 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 für Ihre App gilt, darf das Manifest kein <meta-data>-Element in einem <activity>-Element enthalten:

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

Wenn eine Aktivität in Ihrer App fortgesetzt wird, wenn UX-Einschränkungen aktiv werden, wird sie von einer 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 in 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 Angehalten wechseln.

Wiedergabe beenden und Wiederaufnahme verhindern

Bei einigen Apps reicht es aus, die Wiedergabe während onPause() zu pausieren und den Status zu erfassen, um die Wiederaufnahme der Wiedergabe bis onResume() zu verhindern, um die Anforderungen an Ablenkungen für Fahrer zu erfüllen.

Wenn die Reaktion auf Lebenszyklus-Callbacks für Ihre App nicht ausreicht, können Sie wie im folgenden Abschnitt beschrieben direkt auf den Status der UX-Einschränkungen achten. Bei Apps, die Bild-im-Bild unterstützen, sollten Sie beispielsweise lieber direkt zuhören, anstatt bedingte Prüfungen in Lebenszyklus-Callbacks durchzuführen.

Einschränkungen der Nutzerfreundlichkeit berücksichtigen

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

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

Verwenden Sie CarUxRestrictionsManager, um den Status der UX-Einschränkung zu lesen. Versuchen Sie nicht, den Status der UX-Einschränkungen anhand anderer Hardwarestatus wie Gang oder Geschwindigkeit zu bestimmen, da sich die UX-Einschränkungen von Display zu Display innerhalb eines Fahrzeugs unterscheiden können.

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

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

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

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

Der einzige Wert, der von CarUxRestrictions bereitgestellt wird und auf den Ihre App verweisen sollte, ist der Rückgabewert von isRequiresDistractionOptimization(). Andere Werte sind nur für Aktivitäten relevant, die als ablenkungsfrei gekennzeichnet sind.

Implementierung testen

Prüfen Sie anhand der folgenden Schritte, ob Ihre App die Anforderungen an die Ablenkung von Autofahrern erfüllt:

  1. Installieren Sie Ihre App auf einem System-Image ohne Google Play Store oder Kompatibilitätsmodus.
  2. Öffnen Sie das App-Raster des Launchers, simulieren Sie das Fahren und prüfen Sie, ob Ihre App nicht geöffnet werden kann.
  3. Beenden Sie die Simulation des Fahrens, öffnen Sie die App auf einem Wiedergabebildschirm und starten Sie die Wiedergabe.
  4. Simulieren Sie noch einmal das Fahren und prüfen Sie, ob die Wiedergabe pausiert wird.
    1. Wenn deine App die Einbindung in 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

Damit Ihre Nutzer die bestmögliche Nutzererfahrung im Auto haben, sollten Sie beim Erstellen Ihrer App für Android Automotive OS Folgendes beachten:

Mit Fenstereinsätzen und Displayausschnitten arbeiten

Wie bei anderen Formfaktoren enthält Android Automotive OS System-UI-Elemente wie Status- und Navigationsbalken sowie Unterstützung für nicht rechteckige Displays.

Standardmäßig werden Apps in einem Bereich dargestellt, der sich nicht mit Systemleisten oder Displayausschnitten überschneidet. Sie können die Systemleisten jedoch auch in Ihrer App ausblenden, Inhalte dahinter zeichnen oder Inhalte in einem Displayausschnitt anzeigen lassen, wie unter App-Layout innerhalb von Fenstereinblendungen beschrieben. Wenn Ihre App eine dieser Funktionen bietet, finden Sie in den folgenden Abschnitten Informationen dazu, wie Sie dafür sorgen können, dass Ihre App auf allen Android Automotive OS-Geräten ordnungsgemäß funktioniert.

Systemleisten, immersiver Modus und randloses Rendering

Systemleisten in Autos können eine andere Größe und Position haben als bei anderen Formfaktoren. Navigationsleisten können beispielsweise links, rechts oder unten auf dem Bildschirm platziert werden. Selbst wenn es oben eine Statusleiste und unten eine Navigationsleiste gibt (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 festlegen, ob Apps die Systemleisten ein- oder ausblenden können, um in den Vollbildmodus zu wechseln und ihn wieder 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 Apps daran gehindert hat, Systemleisten zu steuern, passiert nichts, wenn eine App die APIs WindowInsetsController (oder WindowInsetsControllerCompat) aufruft, um Systemleisten einzublenden oder auszublenden. Weitere Informationen dazu, wie Sie feststellen können, ob Ihre App die Einzüge ä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 bis zum Rand dargestellt wird, prüfen Sie, ob nur nicht kritische Inhalte hinter den Systemleisten dargestellt werden. Diese Inhalte sind möglicherweise nicht sichtbar, wenn der OEM des Geräts die Einstellung der Farbe oder Transparenz der Balken 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 bis zum Rand des Displays reicht, sollten Sie keine Annahmen über die Größe, Anzahl, den Typ oder die Position der Systemleisten treffen. Verwenden Sie stattdessen die APIs für Fenster-Einsätze, um die Inhalte Ihrer App relativ zu den Systemleisten anzuordnen. Weitere Informationen zur Verwendung dieser APIs finden Sie unter Inhalte in Ihrer App randlos anzeigen. Hartcodierte Werte für den Abstand werden für keinen Formfaktor empfohlen. In Autos funktionieren sie jedoch wahrscheinlich nicht, um Inhalte im sicheren Bereich zu halten.

An Displays mit unregelmäßiger Form anpassen

Neben rechteckigen Displays können einige Fahrzeuge auch Displays mit unregelmäßiger Form haben, wie in Abbildung 1 dargestellt:

Ein Diagramm eines Android Automotive OS-Geräts 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. Der grüne Bereich ist das sichere Rechteck, das sich nicht mit dem Begrenzungsrahmen des Displayausschnitts der Kurve überschneidet.

Wenn Ihre App nicht randlos gerendert wird, müssen Sie nichts weiter tun, damit sie innerhalb des sicheren Bereichs 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 mithilfe von Ressourcen tun, 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 sich die Displayausschnitte auf Android Automotive OS-Geräten von denen auf Mobilgeräten unterscheiden, sollten Sie LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT oder LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES nicht verwenden. Diese Symbole sind für die Ausschnitte auf Mobilgeräten optimiert. 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. Weitere Informationen zu den APIs für Displayausschnitte finden Sie unter Displayausschnitte unterstützen.

Wenn Ihre App im Bereich des Displayausschnitts gerendert wird und Sie ein anderes Verhalten für Android Automotive OS und Mobilgeräte wünschen, lesen Sie den Hilfeartikel Funktionen deaktivieren, wenn Ihre App dieses Verhalten zur Laufzeit festlegt, und Alternativressourcen verwenden, wenn Ihre App dieses Verhalten mithilfe von Ressourcendateien festlegt.

Funktionen 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 das beispielsweise nicht der Fall. 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.

Sie können die PackageManager.hasSystemFeature API verwenden, um zu prüfen, ob die App unter Android Automotive OS ausgeführt wird. Suchen Sie dazu nach der Funktion FEATURE_AUTOMOTIVE, wie im folgenden Beispiel gezeigt:

Kotlin

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

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean 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 auf Android Automotive OS oder Android Auto ausgeführt wird oder ob sie überhaupt nicht mit einem Auto verbunden ist.

Beachten Sie für die Funktion „Bild-im-Bild“ (PiP) die etablierten Best Practices, um zu prüfen, ob die Funktion verfügbar ist, und reagieren Sie entsprechend.

Offlineszenarien verarbeiten

Autos sind immer häufiger mit dem Internet verbunden. Es wird jedoch empfohlen, dass Apps auch ohne Internetverbindung ausgeführt werden können, z. B. in den folgenden Fällen:

  • Nutzer können die mobilen Daten deaktivieren, die im Rahmen eines Abopakets vom Autohersteller angeboten werden.
  • In bestimmten Gebieten ist der Zugriff auf mobile Daten möglicherweise eingeschränkt.
  • Autos mit WLAN-Funkschnittstellen befinden sich möglicherweise außerhalb der WLAN-Abdeckung oder ein OEM hat das WLAN zugunsten eines Mobilfunknetzes deaktiviert.

Bereiten Sie sich darauf vor, diese Szenarien in Ihrer App zu handhaben, indem Sie die Funktionalität, die vom Internetzugriff abhängt, schrittweise herunterfahren, z. B. durch das Anbieten von Offlineinhalten. Weitere Informationen finden Sie in den Best Practices für die Netzwerkoptimierung.

Alternative Ressourcen verwenden

Sie können den car-Ressourcenqualifizierer verwenden, um alternative Ressourcen bereitzustellen, wenn Ihre App in einem Fahrzeug mit Android Automotive OS ausgeführt wird. Wenn Sie beispielsweise Dimensionsressourcen zum Speichern von Abständewerten verwenden, können Sie einen größeren Wert für den car-Ressourcensatz verwenden, um Touch-Ziele zu vergrößern.