Android Automotive OS-Unterstützung zu deiner Medien-App hinzufügen

Mit Android Automotive OS können Nutzer Apps im Auto installieren. Wenn Sie Nutzer auf dieser Plattform erreichen möchten, müssen Sie eine für Autofahrer optimierte App anbieten, die mit Android Automotive OS kompatibel ist. Du kannst fast den gesamten Code und die Ressourcen in deiner Android Auto-App wiederverwenden, musst aber einen separaten Build erstellen, der die Anforderungen auf dieser Seite erfüllt.

Überblick über die Entwicklung

Das Hinzufügen der Unterstützung für Android Automotive OS erfordert nur wenige Schritte, wie in den folgenden Abschnitten beschrieben:

  1. Automobilfunktionen in Android Studio aktivieren
  2. Ein Automobilmodul erstellen
  3. Aktualisieren Sie Ihre Gradle-Abhängigkeiten.
  4. Optional: Einstellungen und Anmeldeaktivitäten implementieren
  5. Optional: Media Host Hints lesen

Überlegungen zum Design

Android Automotive OS sorgt für das Layout der Medieninhalte, die vom Medienbrowserdienst Ihrer App empfangen werden. Das bedeutet, dass Ihre App weder die Benutzeroberfläche gezeichnet noch eine Ihrer Aktivitäten startet, wenn ein Nutzer die Medienwiedergabe auslöst.

Wenn du Einstellungen oder Anmeldeaktivitäten implementierst, müssen diese Aktivitäten fahrzeugoptimiert sein. Orientiere dich beim Entwerfen dieser Bereiche deiner App an den Designrichtlinien für Android Automotive OS.

Projekt einrichten

Du musst mehrere Teile deines App-Projekts einrichten, um die Unterstützung für Android Automotive OS zu aktivieren.

Automobilfunktionen in Android Studio aktivieren

Verwenden Sie Android Studio 4.0 oder höher, um sicherzustellen, dass alle Automotive OS-Funktionen aktiviert sind.

Modul für die Automobilbranche erstellen

Einige Komponenten von Android Automotive OS, wie das Manifest, haben plattformspezifische Anforderungen. Erstellen Sie ein Modul, das den Code für diese Komponenten vom anderen Code in Ihrem Projekt getrennt halten kann, z. B. den Code für Ihre Telefon-App.

So fügen Sie Ihrem Projekt ein Automobilmodul hinzu:

  1. Klicken Sie in Android Studio auf File > New > New Module.
  2. Wählen Sie Automotive Module (Automobilmodul) aus und klicken Sie auf Next (Weiter).
  3. Geben Sie einen Namen für die Anwendung/Bibliothek ein. Dies ist der Name, den Nutzer unter Android Automotive OS für deine App sehen.
  4. Geben Sie einen Modulnamen ein.
  5. Passen Sie den Paketnamen an Ihre App an.
  6. Wählen Sie API 28: Android 9.0 (Pie) als Minimum SDK aus und klicken Sie dann auf Weiter.

    Alle Autos, die Android Automotive OS unterstützen, laufen unter Android 9 (API-Level 28) oder höher. Wenn Sie diesen Wert auswählen, werden alle kompatiblen Autos ausgewählt.

  7. Wählen Sie No Activity (Keine Aktivität) aus und klicken Sie auf Finish (Fertigstellen).

Nachdem du das Modul in Android Studio erstellt hast, öffne das AndroidManifest.xml in deinem neuen Automobilmodul:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

Das Element application enthält einige standardmäßige App-Informationen sowie ein uses-feature-Element, das die Unterstützung für Android Automotive OS deklariert. Im Manifest sind keine Aktivitäten deklariert.

Wenn du Einstellungen oder Anmeldeaktivitäten implementierst, kannst du diese hier hinzufügen. Diese Aktivitäten werden vom System mithilfe expliziter Intents ausgelöst und sind die einzigen Aktivitäten, die Sie im Manifest für Ihre Android Automotive OS-App deklarieren.

Nachdem Sie Einstellungen oder Anmeldeaktivitäten hinzugefügt haben, vervollständigen Sie Ihre Manifestdatei. Legen Sie dazu das Attribut android:appCategory="audio" im Element application fest und fügen Sie die folgenden uses-feature-Elemente hinzu:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:appCategory="audio"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

    <uses-feature
        android:name="android.hardware.wifi"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.landscape"
        android:required="false" />

</manifest>

Durch das explizite Festlegen dieser Funktionen auf required="false" wird sichergestellt, dass Ihre App nicht mit verfügbaren Hardwarefunktionen in Automotive OS-Geräten in Konflikt steht.

Medienunterstützung für Android Automotive OS deklarieren

Erklären Sie mit dem folgenden Manifesteintrag, dass Ihre App Android Automotive OS unterstützt:

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

Dieser Manifesteintrag verweist auf eine XML-Datei, in der die Fahrzeugfunktionen deklariert werden, die von deiner Anwendung unterstützt werden.

Wenn Sie angeben möchten, dass Sie eine Medien-App haben, fügen Sie dem Verzeichnis res/xml/ in Ihrem Projekt eine XML-Datei mit dem Namen automotive_app_desc.xml hinzu. Die Datei muss Folgendes enthalten:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

Intent-Filter

Android Automotive OS verwendet explizite Intents, um Aktivitäten in Ihrer Medien-App auszulösen. Schließen Sie keine Aktivitäten mit CATEGORY_LAUNCHER- oder ACTION_MAIN-Intent-Filtern in der Manifestdatei ein.

Aktivitäten wie die im folgenden Beispiel zielen in der Regel auf ein Smartphone oder ein anderes Mobilgerät ab. Deklariere diese Aktivitäten in dem Modul, mit dem die Smartphone-App erstellt wird, und nicht in dem Modul, mit dem deine Android Automotive OS-App erstellt wird.

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

Gradle-Abhängigkeiten aktualisieren

Wir empfehlen, den Medienbrowserdienst in einem separaten Modul zu speichern, das Sie zwischen der Smartphone-App und dem Fahrzeugmodul teilen. Wenn Sie diesen Ansatz verwenden, müssen Sie Ihr Fahrzeugmodul aktualisieren, um das freigegebene Modul aufzunehmen, wie im folgenden Snippet gezeigt:

my-auto-module/build.gradle

Groovig

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

Einstellungen und Anmeldeaktivitäten implementieren

Neben deinem Medienbrowser kannst du auch fahrzeugoptimierte Einstellungen und Anmeldeaktivitäten für deine Android Automotive OS-App bereitstellen. Damit kannst du App-Funktionen bereitstellen, die in den Android Media APIs nicht enthalten sind.

Implementiere diese Aktivitäten nur, wenn in deiner Android Automotive OS-App Nutzern die Anmeldung erlaubt oder App-Einstellungen festgelegt werden müssen. Diese Aktivitäten werden von Android Auto nicht verwendet.

Aktivitäts-Workflows

Das folgende Diagramm zeigt, wie ein Nutzer über Android Automotive OS mit Ihren Einstellungen und Anmeldeaktivitäten interagiert:

Workflows für Einstellungen und Anmeldeaktivitäten

Abbildung 1: Einstellungen und Workflows für Anmeldeaktivitäten.

Ablenkungen in Einstellungen und Anmeldeaktivitäten vermeiden

Damit deine Einstellungen und/oder Anmeldeaktivitäten nur verwendet werden können, während das Fahrzeug des Nutzers geparkt ist, dürfen die <activity>-Elemente nicht das folgende <meta-data>-Element enthalten. Wenn ein solches Element vorhanden ist, wird Ihre App bei der Überprüfung abgelehnt.

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

Einstellungsaktivität hinzufügen

Du kannst eine für Fahrzeuge optimierte Einstellung hinzufügen, damit Nutzer Einstellungen für deine App in ihrem Auto konfigurieren können. Ihre Einstellungsaktivitäten können auch andere Workflows enthalten, z. B. das An- und Abmelden im Konto eines Nutzers oder das Wechseln von Nutzerkonten. Diese Aktivität wird nur durch eine App unter Android Automotive OS ausgelöst. Mit Android Auto verbundene Telefon-Apps verwenden es nicht.

Einstellungsaktivität deklarieren

Sie müssen Ihre Einstellungsaktivität in der Manifestdatei Ihrer App deklarieren, wie im folgenden Code-Snippet gezeigt:

<application>
    ...
    <activity android:name=".AppSettingsActivity"
              android:exported="true"
              android:theme="@style/SettingsActivity"
              android:label="@string/app_settings_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
        </intent-filter>
    </activity>
    ...
</application>

Einstellungsaktivitäten implementieren

Wenn ein Nutzer deine App startet, erkennt Android Automotive OS die von dir angegebene Aktivität zu Einstellungen und zeigt ein Angebot an, z. B. ein Symbol. Der Nutzer kann dieses Angebot antippen oder über das Display seines Autos auswählen, um zur Aktivität zu gelangen. Android Automotive OS sendet den ACTION_APPLICATION_PREFERENCES-Intent, der deine App auffordert, deine Einstellungsaktivität zu starten.

Im Rest dieses Abschnitts erfahren Sie, wie Sie Code aus der Beispiel-App für den universellen Android Music Player (UAMP) anpassen können, um eine Aktivität zu den Einstellungen in Ihrer App zu implementieren.

Laden Sie zuerst den Beispielcode herunter:

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

So implementieren Sie Ihre Aktivität:

  1. Kopieren Sie den Ordner automotive/automotive-lib in Ihr Fahrzeugmodul.
  2. Definieren Sie eine Einstellungsstruktur wie in automotive/src/main/res/xml/preferences.xml.
  3. Implementieren Sie einen PreferenceFragmentCompat, der in Ihrer Einstellungsaktivität angezeigt wird. Weitere Informationen finden Sie in den Dateien SettingsFragment.kt und SettingsActivity.kt in UAMP und im Leitfaden zu Android-Einstellungen.

Berücksichtigen Sie beim Implementieren der Aktivität zu Einstellungen die folgenden Best Practices für die Verwendung einiger Komponenten aus der Einstellungsbibliothek:

  • In den Einstellungen Ihrer Aktivität darf die Tiefe nicht mehr als zwei Ebenen unter der Hauptansicht liegen.
  • Verwende kein DropDownPreference. Verwenden Sie stattdessen ListPreference.
  • Organisatorische Komponenten:
  • Fügen Sie in alle folgenden Komponenten key und title ein. Sie können auch einen summary, einen icon oder beides angeben:
    • Preference
      • Passe die Logik im onPreferenceTreeClick()-Callback deiner PreferenceFragmentCompat-Implementierung an.
    • CheckBoxPreference
      • Kann summaryOn oder summaryOff anstelle von summary für bedingten Text enthalten.
    • SwitchPreference
      • Kann summaryOn oder summaryOff anstelle von summary für bedingten Text enthalten.
      • Kann switchTextOn oder switchTextOff haben.
    • SeekBarPreference
      • Füge min, max und defaultValue hinzu.
    • EditTextPreference
      • Du kannst dialogTitle, positiveButtonText und negativeButtonText einschließen.
      • Kann dialogMessage und/oder dialogLayoutResource haben.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Leitet hauptsächlich aus ListPreference ab.
      • Wird verwendet, um eine Liste mit Preference-Objekten mit einer Auswahlmöglichkeit anzuzeigen.
      • Muss ein Array von entries und den entsprechenden entryValues-Wert haben.
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • Leitet hauptsächlich aus MultiSelectListPreference ab
      • Dient zum Anzeigen einer Multiple-Choice-Liste mit Preference-Objekten.
      • Muss ein Array von entries und den entsprechenden entryValues-Wert haben.

Anmeldeaktivität hinzufügen

Wenn sich ein Nutzer in Ihrer App anmelden muss, bevor er die App verwenden kann, kannst du eine für Fahrzeuge optimierte Anmeldeaktivität hinzufügen, die die An- und Abmeldung in deiner App verarbeitet. Du kannst auch Anmelde- und Abmeldeabläufen zu einer Einstellungsaktivität hinzufügen. Verwende jedoch eine dedizierte Anmeldeaktivität, wenn deine App erst nach der Anmeldung eines Nutzers verwendet werden kann. Diese Aktivität wird nur von einer App ausgelöst, die unter Android Automotive OS ausgeführt wird. Mit Android Auto verbundene Smartphone-Apps verwenden die Funktion nicht.

Anmeldung beim Start der App verlangen

Damit ein Nutzer sich anmelden muss, bevor er Ihre Anwendung verwenden kann, muss Ihr Medienbrowserdienst die folgenden Schritte ausführen:

  1. Senden Sie in der Methode onLoadChildren() Ihres Dienstes das null-Ergebnis mit der Methode sendResult().
  2. Legen Sie den PlaybackStateCompat der Mediensitzung mit der Methode setState() auf STATE_ERROR fest. Dadurch wird Android Automotive OS mitgeteilt, dass keine weiteren Vorgänge ausgeführt werden können, bis der Fehler behoben wurde.
  3. Setzen Sie den PlaybackStateCompat-Fehlercode der Mediensitzung auf ERROR_CODE_AUTHENTICATION_EXPIRED. Dadurch wird Android Automotive OS mitgeteilt, dass sich der Nutzer authentifizieren muss.
  4. Legen Sie die PlaybackStateCompat-Fehlermeldung der Mediensitzung mit der Methode setErrorMessage() fest. Da diese Fehlermeldung für den Nutzer gilt, lokalisieren Sie sie für die aktuelle Sprache des Nutzers.
  5. Legen Sie die PlaybackStateCompat-Extras der Mediensitzung mit der Methode setExtras() fest. Fügen Sie die folgenden beiden Schlüssel hinzu:

Das folgende Code-Snippet zeigt, wie Sie in Ihrer App festlegen können, dass Nutzer sich anmelden müssen, bevor sie die App verwenden können:

Kotlin

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

Java

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

Nachdem der Nutzer erfolgreich authentifiziert wurde, setze PlaybackStateCompat auf einen anderen Status als STATE_ERROR zurück und kehre dann zu Android Automotive OS zurück. Dazu rufst du die Methode finish() der Aktivität auf.

Anmeldeaktivitäten implementieren

Google bietet eine Vielzahl von Identitätstools, mit denen du Nutzer dabei unterstützen kannst, sich über ihr Auto in deiner App anzumelden. Einige Tools wie Firebase Authentication bieten Full-Stack-Toolkits an, mit denen Sie benutzerdefinierte Authentifizierungsumgebungen erstellen können. Andere Tools nutzen vorhandene Anmeldedaten oder andere Technologien eines Nutzers, um eine nahtlose Anmeldung zu ermöglichen.

Mit den folgenden Tools können Sie die Anmeldung für Nutzer vereinfachen, die sich bereits auf einem anderen Gerät angemeldet haben:

  • Anmeldung und Registrierung mit One Tap:Wenn Sie One Tap bereits für andere Geräte wie etwa Ihre Smartphone-App implementiert haben, implementieren Sie die Funktion für Ihre Android Automotive OS-App, um bestehende One Tap-Nutzer zu unterstützen.
  • Google Log-in:Wenn Google Log-in bereits für andere Geräte wie die Smartphone-App implementiert ist, kannst du Google Log-in für deine Android Automotive OS-App implementieren, um bestehende Google Log-in-Nutzer zu unterstützen.
  • Autofill mit Google:Wenn Nutzer auf ihren anderen Android-Geräten die Funktion „Autofill mit Google“ aktiviert haben, werden ihre Anmeldedaten im Passwortmanager von Google gespeichert. Wenn sich diese Nutzer in Ihrer Android Automotive OS-App anmelden, schlägt Autofill mit Google relevante gespeicherte Anmeldedaten vor. Die Verwendung von Autofill mit Google erfordert keinen Aufwand für die Anwendungsentwicklung. App-Entwickler können jedoch ihre Apps für bessere Ergebnisse optimieren. Autofill mit Google wird auf allen Geräten mit Android 8.0 (API-Level 26) oder höher unterstützt, einschließlich Android Automotive OS.

Account Manager verwenden

Android Automotive OS-Apps mit Authentifizierung müssen aus folgenden Gründen AccountManager verwenden:

  • Bessere Nutzerfreundlichkeit und einfachere Kontoverwaltung:Nutzer können alle ihre Konten ganz einfach über das Kontomenü in den Systemeinstellungen verwalten, einschließlich der An- und Abmeldung.
  • Gasterlebnis:Autos sind gemeinsam verwendete Geräte. Das bedeutet, dass OEMs ein „Gasterlebnis“ im Fahrzeug ermöglichen können, wo keine Konten hinzugefügt werden können. Diese Einschränkung wird mit DISALLOW_MODIFY_ACCOUNTS für AccountManager erreicht.

Berechtigungen

Wenn Sie Berechtigungen vom Nutzer anfordern müssen, verwenden Sie denselben Ablauf wie für die Authentifizierungsaktivität oder die Aktivität zu Einstellungen im Diagramm des Aktivitätsworkflows aus einem vorherigen Abschnitt.

Media-Host-Hinweise lesen

Abhängig von der Systemanwendung (einschließlich ihrer Version), die eine Verbindung zu Ihrem Medienbrowserdienst herstellt, erhält Ihre Anwendung möglicherweise die folgenden Extras:

Fehlerbehandlung

Fehler in Medien-Apps unter Android Automotive OS werden über die PlaybackStateCompat der Mediensitzung mitgeteilt. Legen Sie für alle Fehler einen geeigneten Fehlercode und eine Fehlermeldung im PlaybackStateCompat fest. Dadurch wird ein Toast in der UI angezeigt.

Wenn ein Fehler auftritt, die Wiedergabe aber fortgesetzt werden kann, tritt ein nicht schwerwiegender Fehler auf. Beispielsweise kann ein Nutzer möglicherweise vor der Anmeldung in einer App Musik abspielen, muss sich jedoch anmelden, bevor er einen Song überspringen kann. Bei einem nicht schwerwiegenden Fehler kann das System vorschlagen, dass der Nutzer sich anmelden kann, ohne die Wiedergabe für das aktuelle Medienelement zu unterbrechen.

Wenn Sie einen nicht schwerwiegenden Fehler ausgeben, behalten Sie den Rest des PlaybackStateCompat unverändert, mit Ausnahme des Fehlercodes und der Fehlermeldung. Mit dieser Methode kann die Wiedergabe des aktuellen Medienelements fortgesetzt werden, während der Nutzer entscheidet, ob er sich anmelden möchte.

Wenn eine Wiedergabe nicht möglich ist, z. B. wenn keine Internetverbindung und keine Offlineinhalte vorhanden sind, setzen Sie den Status PlaybackStateCompat auf STATE_ERROR.

Löschen Sie bei nachfolgenden Aktualisierungen von PlaybackStateCompat alle Fehlercodes und Fehlermeldungen, um zu vermeiden, dass mehrere Warnungen für denselben Fehler angezeigt werden.

Wenn Sie zu irgendeinem Zeitpunkt keinen Suchbaum laden können, z. B. wenn Sie eine Authentifizierung benötigen und der Nutzer nicht angemeldet ist, senden Sie einen leeren Suchbaum. Geben Sie ein Null-Ergebnis von onLoadChildren() für den Stammmedienknoten zurück, um dies anzugeben. In diesem Fall zeigt das System einen Vollbildfehler an, wobei die Fehlermeldung im PlaybackStateCompat festgelegt ist.

Bearbeitbare Fehler

Wenn ein Fehler behoben werden kann, legen Sie zusätzlich die folgenden beiden Extras in der PlaybackStateCompat fest:

Bearbeitbare Fehler werden als Dialog angezeigt und können von Nutzern nur dann behoben werden, wenn das Auto angehalten wird.

Fehlerfälle testen

Prüfen Sie, ob Ihre App Fehler in allen Szenarien ordnungsgemäß verarbeitet, einschließlich:

  • Verschiedene Stufen Ihres Produkts, z. B. kostenlos oder Premium oder mit Anmeldung und ohne Anmeldung
  • Unterschiedliche Fahrstatus, z. B. „Geparkt“ und „Fahren“
  • Unterschiedliche Verbindungsstatus, z. B. online oder offline

Weitere Überlegungen

Beachten Sie bei der Entwicklung Ihrer Android Automotive OS-App auch die folgenden Aspekte:

Offlineinhalte

Implementieren Sie gegebenenfalls die Unterstützung für die Offline-Wiedergabe. Autos mit Android Automotive OS müssen über eine eigene Datenverbindung verfügen, d. h., ein Datentarif ist in den Kosten des Fahrzeugs enthalten oder wird vom Nutzer bezahlt. Es ist jedoch zu erwarten, dass die Konnektivität von Autos stärker variiert als von Mobilgeräten.

Bei der Planung Ihrer Offline-Supportstrategie sollten Sie Folgendes beachten:

  • Inhalte sollten am besten während der Verwendung der App heruntergeladen werden.
  • Gehen Sie nicht davon aus, dass WLAN verfügbar ist. Ein Auto kann nie in WLAN-Reichweite gelangen oder der OEM hat WLAN zugunsten eines Mobilfunknetzes deaktiviert.
  • Es ist zwar in Ordnung, die Inhalte, die Nutzer verwenden sollen, intelligent im Cache zu speichern. Wir empfehlen jedoch, den Nutzern die Möglichkeit zu geben, dieses Verhalten in den Einstellungen zu ändern.
  • Der Speicherplatz in Autos variiert. Deshalb sollten Sie Nutzern die Möglichkeit bieten, Offline-Inhalte zu löschen, beispielsweise über eine Option in den Einstellungen.

WebView-Unterstützung

WebViews werden in Android Automotive OS unterstützt, sind aber nur für deine Einstellungen und Anmeldeaktivitäten zugelassen. Aktivitäten, die ein WebView verwenden, müssen eine „close“- oder „back“-Angebot außerhalb von WebView haben.

Hier sind einige Beispiele für akzeptable Anwendungsfälle für WebViews:

  • Anzeige deiner Datenschutzerklärung, Nutzungsbedingungen oder anderer rechtlicher Links in deinen Einstellungen.
  • Ein webbasierter Ablauf bei Ihren Anmeldeaktivitäten.

Wenn Sie ein WebView verwenden, können Sie JavaScript aktivieren.

WebView schützen

Treffen Sie alle verfügbaren Vorkehrungen, um sicherzustellen, dass Ihr WebView kein Einstiegspunkt in das gesamte Internet ist. Das folgende Code-Snippet zeigt ein Beispiel dafür, wie Sie das WebView an die im loadUrl()-Aufruf verwendete URL fixieren und Weiterleitungen verhindern können. Wir empfehlen dringend, Sicherheitsmaßnahmen wie diese einzuführen, wenn dies möglich ist, z. B. bei der Anzeige von rechtlich relevanten Links.

Kotlin

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

Java

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

Paketnamen

Da Sie ein separates Android Package Kit (APK) für Android Automotive OS vertreiben, können Sie den Paketnamen aus Ihrer mobilen App wiederverwenden oder einen neuen Paketnamen erstellen. Wenn Sie einen anderen Paketnamen verwenden, hat Ihre App zwei separate Play Store-Einträge. Wenn Sie den aktuellen Paketnamen wiederverwenden, hat Ihre Anwendung auf beiden Plattformen einen einzigen Eintrag.

Das ist in erster Linie eine geschäftliche Entscheidung. Wenn beispielsweise ein Team an der mobilen App und ein separates Team an Ihrer Android Automotive OS-App arbeitet, kann es sinnvoll sein, separate Paketnamen zu verwenden und jedem Team die Möglichkeit zu geben, seinen eigenen Play Store-Eintrag zu verwalten. Es gibt keinen großen Unterschied hinsichtlich des technischen Aufwands, der für die Verwendung beider Ansätze erforderlich ist.

In der folgenden Tabelle sind einige andere wichtige Unterschiede zusammengefasst, die zwischen der Beibehaltung des aktuellen Paketnamens und der Verwendung eines neuen Paketnamens bestehen:

Funktion Derselbe Paketname Neuer Paketname
Store-Eintrag Single Mehrere
Gespiegelte Installation Ja: „Schnelle App-Neuinstallation“ während des Einrichtungsassistenten Nein
Play Store-Überprüfungsprozess Rezensionen blockieren: Wenn die Überprüfung bei einem APK fehlschlägt, werden andere APKs, die im selben Release eingereicht wurden, blockiert. Einzelne Rezensionen
Statistiken, Messwerte und Vitals Kombiniert: Sie können nach Fahrzeugdaten filtern. Aufheben
Indexierung und Suchranking Aktuellen Stand aufbauen Kein Übertrag
In andere Apps integrieren Höchstwahrscheinlich sind keine Änderungen erforderlich, vorausgesetzt, dass der Mediencode für beide APKs freigegeben ist Möglicherweise muss die entsprechende App aktualisiert werden, z. B. für die URI-Wiedergabe mit Google Assistant.

Häufig gestellte Fragen

In den folgenden Abschnitten finden Sie Antworten auf einige häufig gestellte Fragen zu Android Automotive OS.

Hardware

Kann meine App auf das Mikrofon zugreifen?

Informationen zu Apps, die auf Android 10 (API-Level 29) oder höher ausgerichtet sind, finden Sie in der Dokumentation zur Freigabe der Audioeingabe. Dies ist vor API-Level 29 nicht möglich.

Auf welche Auto-APIs können wir zugreifen und wie?

Sie können nur die APIs verwenden, die vom OEM zur Verfügung gestellt werden. Prozesse werden entwickelt, um den Zugriff auf diese APIs zu standardisieren.

Apps können mit SetProperty() und GetProperty() in CarPropertyManager auf Auto-APIs zugreifen. Eine Liste aller verfügbaren Attribute finden Sie im Quellcode oder in der Referenzdokumentation. Ist die Eigenschaft mit @SystemApi annotiert, ist sie auf vorab geladene System-Apps beschränkt.

Welche Arten von Audio-Codecs werden unterstützt?

Weitere Informationen finden Sie in den Audio-Codec-Details in der Android-CDD.

Wird Widevine DRM unterstützt?

Ja. Widevine DRM wird unterstützt.

Entwicklung und Tests

Gibt es Einschränkungen oder Empfehlungen für die Verwendung von SDKs und Bibliotheken von Drittanbietern?

Für die Verwendung von SDKs und Bibliotheken von Drittanbietern haben wir keine speziellen Richtlinien. Auch wenn du SDKs und Bibliotheken von Drittanbietern verwendest, musst du alle Qualitätsanforderungen für Auto-Apps erfüllen.

Kann ich einen Dienst im Vordergrund verwenden?

Der einzige zulässige Anwendungsfall für einen Dienst im Vordergrund ist das Herunterladen von Inhalten für die Offlinenutzung. Wenn Sie einen anderen Anwendungsfall für einen Dienst im Vordergrund haben, für den Sie Support benötigen, kontaktieren Sie uns über das Android Automotive OS-Forum.

Android Automotive OS-Apps veröffentlichen

Wie veröffentliche ich meine Android Automotive OS-App über die Google Play Console?

Die Veröffentlichung einer App ähnelt der Veröffentlichung einer Smartphone-App, allerdings wird ein anderer Formfaktor verwendet. So aktivieren Sie die Verwendung des Formfaktors Android Automotive OS für Ihre App:

  1. Öffnen Sie die Play Console.
  2. Wählen Sie Ihre App aus.
  3. Klicken Sie im Menü auf der linken Seite auf Release > Einrichten > Erweiterte Einstellungen > Formfaktoren.
  4. Klicke auf Formfaktor hinzufügen > Android Automotive OS und folge der Anleitung in der Play Console.

Weitere Informationen

Weitere Informationen zu Android Automotive OS finden Sie in den folgenden zusätzlichen Ressourcen.

Produktproben

Leitfäden

Blogs

Videos

Problem mit Android Automotive OS-Medien melden

Wenn bei der Entwicklung Ihrer Medien-App für Android Automotive OS ein Problem auftritt, können Sie es über den Google Issue Tracker melden. Geben Sie in der Problemvorlage alle erforderlichen Informationen an.

Neues Problem erstellen

Bevor Sie ein neues Problem melden, prüfen Sie, ob es bereits in der Problemliste aufgeführt ist. Sie können Themen abonnieren und für sie abstimmen, indem Sie im Tracker auf den Stern für ein Problem klicken. Weitere Informationen finden Sie unter Ausgaben abonnieren.