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

Mit Android Automotive OS können Nutzer Apps in ihrem Auto installieren. Damit Sie Nutzer über diese Plattform erreichen können, müssen Sie eine für Autofahrer optimierte App anbieten, die mit Android Automotive OS kompatibel ist. Für Ihre Android Auto-App können Sie fast allen Code und alle Ressourcen Ihrer bestehenden App verwenden. Sie müssen jedoch einen separaten Build erstellen, der die Anforderungen auf dieser Seite erfüllt.

Entwicklung – Übersicht

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

  1. Automotive-Funktionen in Android Studio aktivieren
  2. Automotive-Modul erstellen
  3. Gradle-Abhängigkeiten aktualisieren
  4. Optional: Einstellungen und Anmeldeaktivitäten implementieren.
  5. Optional: Hinweise zum Media-Host lesen.

Designaspekte

Android Automotive OS kümmert sich um das Layout der Medieninhalte, die es vom Media Browser-Dienst deiner App erhält. Das bedeutet, dass Ihre App die Benutzeroberfläche nicht rendert und keine Ihrer Aktivitäten startet, wenn ein Nutzer die Medienwiedergabe auslöst.

Wenn Sie Einstellungen oder Anmeldeaktivitäten implementieren, müssen diese Aktivitäten für Fahrzeuge optimiert sein. Beachte beim Design dieser Bereiche deiner App die Designrichtlinien für Android Automotive OS.

Projekt einrichten

Sie müssen mehrere Teile des App-Projekts einrichten, um die Unterstützung für Android Automotive OS zu aktivieren.

Automotive-Funktionen in Android Studio aktivieren

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

Automobilmodul erstellen

Für einige Komponenten von Android Automotive OS, z. B. das Manifest, gelten plattformspezifische Anforderungen. Erstellen Sie ein Modul, in dem der Code für diese Komponenten von anderem Code in Ihrem Projekt getrennt ist, z. B. dem Code für Ihre Smartphone-App.

So fügen Sie Ihrem Projekt ein Automotive-Modul 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 Anwendungs-/Bibliotheksnamen ein. Das ist der Name, den Nutzer für Ihre App in Android Automotive OS 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) für das 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, sind alle kompatiblen Autos als Zielgruppe festgelegt.

  7. Wählen Sie Keine Aktivität aus und klicken Sie auf Fertigstellen.

Nachdem Sie Ihr Modul in Android Studio erstellt haben, öffnen Sie die Datei AndroidManifest.xml in Ihrem neuen Automotive-Modul:

<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 Standard-App-Informationen sowie das Element <uses-feature>, mit dem die Unterstützung für Android Automotive OS deklariert wird. Im Manifest sind keine Aktivitäten deklariert.

Wenn Sie Einstellungen oder Anmeldeaktivitäten implementieren, fügen Sie sie hier hinzu. 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 die Manifestdatei, indem Sie das android:appCategory-Attribut des <application>-Elements auf "audio" festlegen.

<application
  ...
  android:appCategory="audio" />

Funktionsanforderungen deklarieren

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.

Medienunterstützung für Android Automotive OS deklarieren

Mit dem folgenden Manifesteintrag deklarieren Sie, 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 von Ihrer App unterstützten Autofunktionen deklariert werden.

Wenn Sie angeben möchten, dass Sie eine Media-App haben, fügen Sie dem Verzeichnis res/xml/ in Ihrem Projekt eine XML-Datei mit dem Namen automotive_app_desc.xml hinzu. Fügen Sie der Datei den folgenden Inhalt hinzu:

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

Intent-Filter

Android Automotive OS verwendet explizite Intents, um Aktivitäten in Ihrer Media-App auszulösen. Nehmen Sie keine Aktivitäten mit CATEGORY_LAUNCHER- oder ACTION_MAIN-Intent-Filtern in die Manifestdatei auf.

Aktivitäten wie im folgenden Beispiel sind in der Regel auf ein Smartphone oder ein anderes Mobilgerät ausgerichtet. Deklarieren Sie diese Aktivitäten im Modul, mit dem die Smartphone-App erstellt wird, nicht im Modul, mit dem Ihre 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 Media-Browser-Dienst in einem separaten Modul zu speichern, das Sie für Ihre Smartphone-App und Ihr Automotive-Modul freigeben. Wenn Sie diesen Ansatz verwenden, müssen Sie Ihr Automobilmodul aktualisieren, um das freigegebene Modul einzuschließen, wie im folgenden Snippet gezeigt:

my-auto-module/build.gradle

Groovy

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

Kotlin

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

Einstellungen und Anmeldeaktivitäten implementieren

Zusätzlich zu Ihrem Media-Browser-Dienst können Sie auch für Fahrzeuge optimierte Einstellungen und Anmeldeaktivitäten für Ihre Android Automotive OS-App bereitstellen. Mit diesen Aktivitäten können Sie App-Funktionen anbieten, die nicht in den Android Media APIs enthalten sind.

Implementieren Sie diese Aktivitäten nur, wenn Nutzer sich in Ihrer Android Automotive OS-App anmelden oder App-Einstellungen festlegen müssen. Diese Aktivitäten werden von Android Auto nicht verwendet.

Aktivitäts-Workflows

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

Workflows für Einstellungen und Anmeldeaktivitäten

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

Ablenkungen in Ihren Einstellungen und Anmeldeaktivitäten vermeiden

Damit Ihre Einstellungen und Anmeldeaktivitäten nur verwendet werden können, wenn das Fahrzeug des Nutzers geparkt ist, prüfen Sie, ob das/die <activity>-Element(e) das folgende <meta-data>-Element nicht enthalten. Ihre App wird während der Überprüfung abgelehnt, wenn ein solches Element vorhanden ist.

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

Einstellungsaktivität hinzufügen

Sie können eine Aktivität für fahrzeugoptimierte Einstellungen hinzufügen, damit Nutzer Einstellungen für Ihre App in ihrem Auto konfigurieren können. Über Ihre Einstellungen können Sie auch andere Arbeitsabläufe ausführen, z. B. sich in einem Nutzerkonto an- oder abmelden oder Nutzerkonten wechseln. Diese Aktivität wird nur durch eine App ausgelöst, die unter Android Automotive OS ausgeführt wird. Smartphone-Apps, die mit Android Auto verbunden sind, verwenden es nicht.

Einstellungen-Aktivität deklarieren

Sie müssen die 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>

Einstellungen implementieren

Wenn ein Nutzer Ihre App startet, erkennt Android Automotive OS die von Ihnen deklarierte Einstellungsaktivität und zeigt eine Aufforderung an, z. B. ein Symbol. Der Nutzer kann diese Aufforderung auf dem Display seines Autos antippen oder auswählen, um zur Aktivität zu navigieren. Android Automotive OS sendet den Intent ACTION_APPLICATION_PREFERENCES, der Ihre App anweist, die Einstellungen zu starten.

Im Rest dieses Abschnitts wird gezeigt, wie Sie Code aus der UAMP-Beispiel-App (Universal Android Music Player) anpassen können, um eine Einstellungsaktivität für Ihre 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 Automotive-Modul.
  2. Definieren Sie einen Einstellungsbaum wie in automotive/src/main/res/xml/preferences.xml.
  3. Implementieren Sie ein PreferenceFragmentCompat, damit Ihre Einstellungen angezeigt werden. Weitere Informationen finden Sie in den Dateien SettingsFragment.kt und SettingsActivity.kt in UAMP und im Leitfaden zu Android-Einstellungen.

Berücksichtigen Sie bei der Implementierung Ihrer Einstellungen die folgenden Best Practices für die Verwendung einiger Komponenten in der Preference-Bibliothek:

  • Die Einstellungen dürfen nicht mehr als zwei Ebenen unterhalb der Hauptansicht umfassen.
  • Verwenden Sie keine DropDownPreference. Verwenden Sie stattdessen ListPreference.
  • Organisationskomponenten:
    • PreferenceScreen
      • Dies muss die oberste Ebene Ihrer Einstellungsstruktur sein.
    • PreferenceCategory
      • Dient zum Gruppieren von Preference-Objekten.
      • Fügen Sie eine title ein.
  • Fügen Sie in alle folgenden Komponenten ein key und ein title ein. Sie können auch summary, icon oder beides einfügen:
    • Preference
      • Passen Sie die Logik im onPreferenceTreeClick()-Callback Ihrer 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 sein.
    • SeekBarPreference
      • Fügen Sie min, max und defaultValue hinzu.
    • EditTextPreference
      • Fügen Sie dialogTitle, positiveButtonText und negativeButtonText hinzu.
      • Kann dialogMessage und/oder dialogLayoutResource enthalten.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Stammt hauptsächlich aus ListPreference.
      • Wird verwendet, um eine Liste mit Preference-Objekten zur Einfachauswahl anzuzeigen.
      • Muss ein Array mit entries und entsprechenden entryValues enthalten.
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • Stammt hauptsächlich aus MultiSelectListPreference
      • Wird verwendet, um eine Liste mit mehreren Auswahlmöglichkeiten von Preference-Objekten anzuzeigen.
      • Muss ein Array mit entries und entsprechenden entryValues enthalten.

Anmeldeaktivität hinzufügen

Wenn sich Nutzer anmelden müssen, bevor sie Ihre App verwenden können, können Sie eine für Fahrzeuge optimierte Anmeldeaktivität hinzufügen, die die Anmeldung und Abmeldung in Ihrer App übernimmt. Sie können An- und Abmeldeabläufe auch einer Einstellungen-Aktivität hinzufügen. Verwenden Sie jedoch eine spezielle Anmeldeaktivität, wenn Ihre App erst verwendet werden kann, nachdem sich ein Nutzer angemeldet hat. Diese Aktivität wird nur durch eine App ausgelöst, die unter Android Automotive OS ausgeführt wird. Smartphone-Apps, die mit Android Auto verbunden sind, verwenden es nicht.

Anmeldung beim Start der App erforderlich

Wenn ein Nutzer sich anmelden muss, bevor er Ihre App verwenden kann, muss Ihr Media-Browser-Dienst Folgendes tun:

  1. Senden Sie in der onLoadChildren()-Methode Ihres Dienstes das null-Ergebnis mit der Methode sendResult().
  2. Legen Sie die PlaybackStateCompat der Mediensitzung mit der Methode setState() auf STATE_ERROR fest. Dadurch wird Android Automotive OS mitgeteilt, dass keine anderen Vorgänge ausgeführt werden können, bis der Fehler behoben wurde.
  3. Setze 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 Nutzer bestimmt ist, müssen Sie sie für die aktuelle Sprache des Nutzers lokalisieren.
  5. Legen Sie die PlaybackStateCompat-Extras der Mediensitzung mit der Methode setExtras() fest. Fügen Sie die folgenden zwei oder drei Schlüssel hinzu:

Das folgende Code-Snippet zeigt, wie Ihre App den Nutzer auffordern kann, sich anzumelden, bevor er Ihre App verwendet:

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, setzen Sie PlaybackStateCompat auf einen anderen Status als STATE_ERROR und leiten Sie den Nutzer dann zurück zu Android Automotive OS, indem Sie die Methode finish() der Aktivität aufrufen.

Anmeldeaktivität implementieren

Google bietet eine Vielzahl von Identitätstools, mit denen Sie Nutzern helfen können, sich in ihren Autos in Ihrer App anzumelden. Einige Tools wie Firebase Authentication bieten Full-Stack-Toolkits, mit denen Sie benutzerdefinierte Authentifizierungsfunktionen erstellen können. Andere Tools nutzen die vorhandenen Anmeldedaten eines Nutzers oder andere Technologien, um Ihnen dabei zu helfen, nahtlose Anmeldevorgänge für Nutzer zu entwickeln.

Die folgenden Tools können Ihnen dabei helfen, die Anmeldung für Nutzer zu vereinfachen, die sich zuvor auf einem anderen Gerät angemeldet haben:

  • Anmeldung und Registrierung über One Tap:Wenn Sie One Tap bereits für andere Geräte wie Ihre Smartphone-App implementiert haben, sollten Sie es auch für Ihre Android Automotive OS-App implementieren, um bestehende One Tap-Nutzer zu unterstützen.
  • Google Log-in:Wenn Sie Google Log-in bereits für andere Geräte wie Ihre Smartphone-App implementiert haben, implementieren Sie Google Log-in für Ihre Android Automotive OS-App, um bestehende Google Log-in-Nutzer zu unterstützen.
  • Autofill mit Google:Wenn Nutzer auf ihren anderen Android-Geräten „Autofill mit Google“ aktiviert haben, werden ihre Anmeldedaten im Google Passwortmanager gespeichert. Wenn sich diese Nutzer in Ihrer Android Automotive OS-App anmelden, schlägt die Funktion „Automatisches Ausfüllen mit Google“ relevante gespeicherte Anmeldedaten vor. Für die Verwendung von Autofill mit Google ist kein Entwicklungsaufwand erforderlich. Anwendungsentwickler können ihre Apps jedoch für bessere Ergebnisse optimieren. Die Funktion „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.

AccountManager verwenden

Android Automotive OS-Apps, die eine Authentifizierung erfordern, müssen AccountManager verwenden. Das hat folgende Gründe:

  • Bessere Nutzerfreundlichkeit und einfachere Kontoverwaltung:Nutzer können alle ihre Konten über das Kontomenü in den Systemeinstellungen verwalten, einschließlich An- und Abmeldung.
  • Gastfunktionen:Autos sind gemeinsam genutzte Geräte. OEMs können daher Gastfunktionen im Fahrzeug aktivieren, bei denen keine Konten hinzugefügt werden können. Diese Einschränkung wird durch DISALLOW_MODIFY_ACCOUNTS für AccountManager erreicht.

Berechtigungen

Wenn Sie Berechtigungen vom Nutzer anfordern müssen, verwenden Sie denselben Ablauf wie bei der Authentifizierungsaktivität oder der Einstellungsaktivität im Aktivitätsablaufdiagramm, das in einem vorherigen Abschnitt gezeigt wurde.

Abmeldung implementieren

Unabhängig davon, wie Sie die Anmeldung implementiert haben, müssen Sie beim Abmelden des Nutzers MediaBrowserServiceCompat#notifyChildrenChanged(rootId) aufrufen, um die Browse-Baumstruktur zu invalidieren. So kann die Media-Host-App alle nutzerbezogenen Informationen (z. B. die letzte Suchanfrage) löschen.

Media-Host-App starten

Sie können Intents erstellen, um die Media-Host-App in Ihrer App oder Inhalte in Ihrer App zu öffnen. Beispiele:

  • Ihre App kann eine Benachrichtigung mit einem PendingIntent posten, mit dem ein Nutzer Ihre App öffnen kann, um sich neue Inhalte anzuhören.
  • Ihre App kann Deeplinks verarbeiten und die Host-App in der am besten geeigneten Ansicht öffnen.

Funktionen des Media-Hosts ermitteln

Die verschiedenen Versionen der Media Host App unterstützen unterschiedliche Funktionen. Hosts geben die Unterstützung für verschiedene Funktionen an, indem sie Intent-Filter für die folgenden Intent-Aktionen einfügen:

Alle Media-Host-Apps unterstützen MEDIA_TEMPLATE-Intents. So ermitteln Sie, ob der Media-Host MEDIA_TEMPLATE_V2-Intents unterstützt:queryIntentActivities()

val isMediaTemplateV2Supported = packageManager.queryIntentActivities(
  Intent(MediaIntentExtras.ACTION_MEDIA_TEMPLATE_V2),
  //  MATCH_DEFAULT_ONLY  since the host should be started with implicit intents
  //  MATCH_SYSTEM_ONLY  excludes any apps that aren't preinstalled
  PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
).size > 0

Intent erstellen und verwenden

Je nachdem, welche Intent-Aktionen vom Media-Host unterstützt werden und was Ihr spezifischer Anwendungsfall ist, können Sie beim Erstellen des Intents, mit dem Sie die Media-Host-App starten, die folgenden Extras angeben.

Zusätzlicher Schlüssel Typ Beschreibung Unterstützte Aktionen
EXTRA_KEY_MEDIA_COMPONENT String Der vereinfachte Komponentenname der MediaBrowserService, mit der die Media-Host-App eine Verbindung herstellen soll. Das ist in der Regel die Komponente für Ihre App. Wenn dieses Extra nicht angegeben ist, wird standardmäßig die aktive Media-Quelle verwendet. MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_QUERY String Der Suchbegriff, der beim Anruf verwendet werden soll MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2
EXTRA_KEY_MEDIA_ID String Die Media-ID, die in der Ansicht „Durchsuchen“ geöffnet werden soll. MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_ACTION Integer Die Aktion, die nach Abschluss der Suche nach EXTRA_KEY_SEARCH_QUERY ausgeführt werden soll. MEDIA_TEMPLATE_V2

Bei einem Host, der MEDIA_TEMPLATE_V2-Aktionen unterstützt, wird mit dem folgenden Code beispielsweise die Media-Host-App geöffnet, eine Verbindung zu MyMediaBrowserService hergestellt, nach „Jazz“ gesucht und dann das erste Element aus den Suchergebnissen wiedergegeben. Auf allen anderen Hosts wird nur die Media-Host-App geöffnet und nach „Jazz“ gesucht. Der Nutzer muss dann ein Element aus den Ergebnissen auswählen, das abgespielt werden soll.

val startMediaHostIntent = Intent(ACTION_MEDIA_TEMPLATE)
  .putExtra(MediaIntentExtras.EXTRA_KEY_MEDIA_COMPONENT, MyMediaBrowserService::class.java)
  .putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_QUERY, "Jazz")
  .putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_ACTION, MediaIntentExtras.EXTRA_VALUE_PLAY_FIRST_ITEM_FROM_SEARCH)

context.startActivity(startMediaHostIntent)

Um die Nutzerfreundlichkeit Ihrer Media-App auf Geräten mit Android Automotive OS zu verbessern, können Sie Deeplinks in Ihre App einbinden. So können Nutzer Ihre App beispielsweise direkt über einen Browser oder beim Empfang einer URL öffnen, die über Quick Share von einem Smartphone geteilt wurde.

Intent-Filter für Deeplinks hinzufügen

Damit das Betriebssystem weiß, dass Ihre App Deeplinks verarbeiten kann, muss sie Aktivitäten mit den entsprechenden Intent-Filtern haben. Informationen zum Format der Intent-Filter, die für Deeplinks verwendet werden, finden Sie unter Intent-Filter für eingehende Links hinzufügen.

Um die Nutzerfreundlichkeit zu optimieren, sollten Sie alle Deeplinks unterstützen, die von Ihrer mobilen App unterstützt werden, sofern sie von Ihrer In-Car-App sinnvoll unterstützt werden können. Wenn Ihre App Einstellungen oder Anmeldeaktivitäten hat, sollten Intent-Filter für die Verarbeitung von Einstellungen und Anmelde-Deeplinks in den entsprechenden <activity>-Manifestelementen deklariert werden. Für die Medienwiedergabe und das Aufrufen von Deeplinks können Sie eine Trampolin-Activity verwenden, wie weiter unten in diesem Abschnitt beschrieben.

Unter Daten aus eingehenden Intents lesen finden Sie Informationen dazu, wie Sie den Intent lesen und darauf reagieren, der zum Starten der Aktivität Ihrer App verwendet wurde.

Da die Benutzeroberfläche für das Browsen und die Wiedergabe von der Host-App gerendert wird, sollte die Aktivität, die zum Verarbeiten von Deeplinks für Wiedergabe- und Browsingvorgänge verwendet wird, keine eigene Benutzeroberfläche haben.

Stattdessen sollte sie in erster Linie zum Erstellen und Verwenden einer Absicht zum Starten der Media-Host-App verwendet werden. Bei Bedarf können damit auch zusätzliche Änderungen am Status Ihrer App vorgenommen werden, z. B. das Hinzufügen von Media-Elementen zur Warteschlange. Das folgende Snippet zeigt ein Beispiel für die Implementierung einer Trampolin-Aktivität:

fun DeepLinkTrampolineActivity : ComponentActivity() {

  override fun onCreate() {
    handleIntent(intent)
  }

  override fun onNewIntent(intent: Intent) {
    handleIntent(intent)
  }

  private fun handleIntent(intent: Intent) {
    // Handle any side effects, such as adding a song to the queue
    ...
    // Build the intent used to start the media host app
    val startMediaHostIntent = ...
    startActivity(intent)
    // Finish the activity immediately so it isn't shown on screen
    finish()
  }
}

Hinweise zum Media-Host lesen

Je nach Systemanwendung (einschließlich ihrer Version), die mit Ihrem Media-Browser-Dienst verbunden ist, kann Ihre Anwendung die folgenden Extras empfangen:

Fehlerbehandlung

Fehler in Medien-Apps unter Android Automotive OS werden über die PlaybackStateCompat der Mediensitzung kommuniziert. Legen Sie für alle Fehler einen passenden Fehlercode und eine passende Fehlermeldung in PlaybackStateCompat fest. Dadurch wird in der Benutzeroberfläche ein Toast angezeigt.

Wenn ein Fehler auftritt, die Wiedergabe aber fortgesetzt werden kann, gib einen nicht schwerwiegenden Fehler aus. So kann ein Nutzer beispielsweise Musik in einer App abspielen, bevor er sich anmeldet, muss sich aber anmelden, bevor er einen Song überspringen kann. Wenn Sie einen nicht schwerwiegenden Fehler verwenden, kann das System dem Nutzer vorschlagen, sich anzumelden, ohne die Wiedergabe des aktuellen Media-Elements zu unterbrechen.

Wenn Sie einen nicht schwerwiegenden Fehler ausgeben, behalten Sie den Rest von PlaybackStateCompat bei, abgesehen vom Fehlercode und der Fehlermeldung. Bei diesem Ansatz kann die Wiedergabe des aktuellen Media-Elements fortgesetzt werden, während der Nutzer entscheidet, ob er sich anmelden möchte.

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

Bei nachfolgenden Aktualisierungen der Datei PlaybackStateCompat sollten Sie alle Fehlercodes und Fehlermeldungen entfernen, um mehrere Warnungen für denselben Fehler zu vermeiden.

Wenn Sie zu einem bestimmten Zeitpunkt keinen Browsing-Baum laden können, z. B. wenn eine Authentifizierung erforderlich ist und der Nutzer nicht angemeldet ist, senden Sie einen leeren Browsing-Baum. Geben Sie dazu ein Nullergebnis von onLoadChildren() für den Media-Stammknoten zurück. In diesem Fall wird auf dem Bildschirm ein Fehler mit der in PlaybackStateCompat festgelegten Fehlermeldung angezeigt.

Behebbare Fehler

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

Behebbare Fehler werden als Dialog angezeigt und können nur behoben werden, wenn das Auto steht.

Fehlerfälle testen

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

  • Verschiedene Stufen Ihres Produkts, z. B. kostenlos im Vergleich zu Premium oder angemeldet im Vergleich zu abgemeldet
  • Verschiedene Fahrzustände:z. B. geparkt oder fahrend
  • Verschiedene Verbindungsstatus, z. B. online oder offline

Außerdem zu beachten

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

Offline-Inhalt

Implementieren Sie gegebenenfalls die Unterstützung für die Offlinewiedergabe. Autos mit Android Automotive OS haben in der Regel eine eigene Datenverbindung. Das bedeutet, dass ein Datentarif im Preis des Fahrzeugs enthalten ist oder vom Nutzer bezahlt wird. Es wird jedoch auch erwartet, dass Autos eine variablere Konnektivität als Mobilgeräte haben.

Hier sind einige Punkte, die Sie bei der Entwicklung Ihrer Offline-Supportstrategie beachten sollten:

  • Die beste Zeit zum Herunterladen von Inhalten ist während der Nutzung Ihrer App.
  • Gehen Sie nicht davon aus, dass WLAN verfügbar ist. Ein Auto kommt möglicherweise nie in WLAN-Reichweite oder der OEM hat WLAN zugunsten eines Mobilfunknetzes deaktiviert.
  • Es ist in Ordnung, Inhalte zu cachen, die Nutzer voraussichtlich verwenden werden. Wir empfehlen jedoch, dass Nutzer dieses Verhalten über Ihre Einstellungen ändern können.
  • Der Speicherplatz in Autos variiert. Bieten Sie Nutzern daher eine Möglichkeit, Offlineinhalte zu löschen, z. B. über eine Option in den Einstellungen.

WebView-Unterstützung

WebViews werden in Android Automotive OS unterstützt, sind aber nur für Ihre Einstellungen und Anmeldeaktivitäten zulässig. Aktivitäten, die eine WebView verwenden, müssen außerhalb der WebView eine Möglichkeit zum Schließen oder Zurückgehen bieten.

Hier einige Beispiele für zulässige Anwendungsfälle für WebViews:

  • Anzeigen Ihrer Datenschutzerklärung, Nutzungsbedingungen oder anderer rechtlicher Links in Ihren Einstellungen
  • Ein webbasierter Ablauf in Ihren Anmeldeaktivitäten.

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

WebView sichern

Treffen Sie alle möglichen Vorsichtsmaßnahmen, um sicherzustellen, dass Ihre WebView kein Einfallstor für das Internet ist. Das folgende Code-Snippet zeigt ein Beispiel dafür, wie Sie die WebView auf die in loadUrl() verwendeten URL festlegen und Weiterleitungen verhindern. Wir empfehlen Ihnen dringend, solche Sicherheitsmaßnahmen zu implementieren, wenn dies möglich ist, z. B. beim Anzeigen von rechtlichen 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 bereitstellen, können Sie den Paketnamen Ihrer mobilen App wiederverwenden oder einen neuen Paketnamen erstellen. Wenn Sie einen anderen Paketnamen verwenden, hat Ihre App zwei separate Google Play Store-Einträge. Wenn Sie Ihren aktuellen Paketnamen wiederverwenden, hat Ihre App auf beiden Plattformen einen einzigen Eintrag.

Das ist in erster Linie eine geschäftliche Entscheidung. Wenn Sie beispielsweise ein Team haben, das an der mobilen App arbeitet, und ein separates Team, das an Ihrer Android Automotive OS-App arbeitet, kann es sinnvoll sein, separate Paketnamen zu verwenden und jedes Team seinen eigenen Google Play Store-Eintrag verwalten zu lassen. Der technische Aufwand für die beiden Ansätze ist nicht sehr unterschiedlich.

In der folgenden Tabelle sind einige weitere wichtige Unterschiede zwischen der Beibehaltung des aktuellen Paketnamens und der Verwendung eines neuen Paketnamens zusammengefasst:

Funktion Derselbe Paketname Neuer Paketname
Store-Eintrag Single Mehrere
Gespiegelte Installation Ja: „Schnelle App-Neuinstallation“ während des Einrichtungsassistenten Nein
Überprüfungsprozess im Google Play Store Rezensionen blockieren: Wenn die Rezension für ein APK fehlschlägt, werden andere APKs, die im selben Release eingereicht wurden, blockiert. Einzelne Rezensionen
Statistiken, Messwerte und Vitals Kombiniert: Sie können nach fahrzeugspezifischen Daten filtern. Trennen
Indexierung und Suchranking Auf dem aktuellen Stand aufbauen Keine Übertragung
Einbindung in andere Apps Wahrscheinlich sind keine Änderungen erforderlich, sofern der Media-Code für beide APKs identisch ist. Möglicherweise müssen Sie die entsprechende App aktualisieren, 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 zum Freigeben von Audioeingaben. Vor API-Level 29 ist das nicht möglich.

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

Sie sind auf die APIs beschränkt, die vom OEM bereitgestellt werden. Es werden Prozesse entwickelt, um den Zugriff auf diese APIs zu standardisieren.

Apps können über SetProperty() und GetProperty() in CarPropertyManager auf Auto-APIs zugreifen. Eine Liste aller verfügbaren Eigenschaften finden Sie im Quellcode oder in der Referenzdokumentation. Wenn das Attribut mit @SystemApi annotated ist, ist es auf vorinstallierte System-Apps beschränkt.

Welche Arten von Audio-Codecs werden unterstützt?

Weitere Informationen finden Sie im Android‑CDD unter Details zu Audio-Codecs.

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?

Wir haben keine spezifischen Richtlinien für die Verwendung von SDKs und Bibliotheken von Drittanbietern. Wenn Sie SDKs und Bibliotheken von Drittanbietern verwenden, sind Sie weiterhin dafür verantwortlich, dass alle Qualitätsanforderungen für Auto-Apps eingehalten werden.

Kann ich einen Dienst im Vordergrund verwenden?

Der einzige zulässige Anwendungsfall für einen Dienst im Vordergrund ist das Herunterladen von Inhalten zur Offlineverwendung. Wenn Sie einen anderen Anwendungsfall für einen Dienst im Vordergrund haben, für den Sie Unterstützung benötigen, wenden Sie sich über die Android Automotive OS-Diskussionsgruppe an uns.

Android Automotive OS-Apps veröffentlichen

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

Weitere Informationen zum Veröffentlichen Ihrer Android Automotive OS-App über die Google Play Console finden Sie unter Für Autos bereitstellen.

Zusätzliche Ressourcen

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

Beispiele

Leitfäden

Blogs

Videos

Problem mit Medien in Android Automotive OS melden

Wenn beim Entwickeln Ihrer Medien-App für Android Automotive OS ein Problem auftritt, können Sie es über die Google Issue Tracker melden. Achten Sie darauf, dass Sie alle erforderlichen Informationen in der Problemvorlage angeben.

Neues Problem erstellen

Bevor Sie ein neues Problem melden, sehen Sie in der Liste der Probleme nach, ob es bereits gemeldet wurde. Sie können Probleme abonnieren und für sie abstimmen, indem Sie im Tracker auf den Stern klicken. Weitere Informationen finden Sie unter Probleme abonnieren.