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. Sie können fast allen Code und alle Ressourcen Ihrer bestehenden Android Auto-App verwenden. Sie müssen jedoch einen separaten Build erstellen, der die Anforderungen auf dieser Seite erfüllt.
Entwicklung – Übersicht
Die Android Automotive OS-Unterstützung lässt sich in wenigen Schritten hinzufügen, wie in den folgenden Abschnitten beschrieben:
- Automobilfunktionen in Android Studio aktivieren
- Erstellen Sie ein Modul für die Automobilbranche.
- Aktualisieren Sie Ihre Gradle-Abhängigkeiten.
- Optional: Einstellungen und Anmeldeaktivitäten implementieren
- Optional: Hinweise zum Mediahost lesen
Designaspekte
Android Automotive OS kümmert sich um das Layout der Medieninhalte, die vom Medienbrowserdienst Ihrer App empfangen werden. Das bedeutet, dass Ihre App die Benutzeroberfläche nicht anzeigt 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 das Fahrzeug optimiert sein. Beachten Sie beim Entwerfen dieser Bereiche Ihrer App die Designrichtlinien für Android Automotive OS.
Projekt einrichten
Sie müssen mehrere Teile des App-Projekts einrichten, um den Support 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.
Automodul erstellen
Für einige Komponenten von Android Automotive OS, z. B. das Manifest, gelten platformspezifische Anforderungen. Erstellen Sie ein Modul, mit dem der Code für diese Komponenten von anderen Code in Ihrem Projekt getrennt werden kann, z. B. vom Code für Ihre Smartphone-App.
So fügen Sie Ihrem Projekt ein Automotive-Modul hinzu:
- Klicken Sie in Android Studio auf File > New > New Module.
- Wählen Sie Automotive Module (Automobilmodul) aus und klicken Sie auf Weiter.
- Geben Sie einen Namen für die Anwendung/Bibliothek ein. Das ist der Name, den Nutzer für Ihre App unter Android Automotive OS sehen.
- Geben Sie einen Modulnamen ein.
- Passen Sie den Paketnamen an Ihre App an.
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, verwenden Android 9 (API-Ebene 28) oder höher. Wenn Sie diesen Wert auswählen, wird die Ausrichtung auf alle kompatiblen Autos festgelegt.
Wählen Sie Keine Aktivität aus und klicken Sie auf Fertigstellen.
Nachdem Sie Ihr Modul in Android Studio erstellt haben, öffnen Sie die 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 ein Element uses-feature
, das die Unterstützung für Android Automotive OS deklariert. Beachten Sie, dass im Manifest keine Aktivitäten deklariert sind.
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="audio"
-Attribut im application
-Element festlegen und die folgenden uses-feature
-Elemente hinzufügen:
<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>
Wenn Sie diese Funktionen explizit auf required="false"
festlegen, wird verhindert, dass Ihre App mit verfügbaren Hardwarefunktionen auf Automotive OS-Geräten in Konflikt gerät.
Medienunterstützung für Android Automotive OS deklarieren
Verwenden Sie den folgenden Manifesteintrag, um anzugeben, 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 bezieht sich auf eine XML-Datei, in der die von Ihrer App unterstützten Funktionen für die Automobilbranche deklariert werden.
Wenn Sie angeben möchten, dass es sich um eine Medien-App handelt, fügen Sie dem Verzeichnis res/xml/
in Ihrem Projekt eine XML-Datei mit dem Namen automotive_app_desc.xml
hinzu. Fügen Sie dieser Datei Folgendes hinzu:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Intent-Filter
Android Automotive OS verwendet explizite Intents, um Aktivitäten in Ihrer Medien-App auszulösen. Fügen Sie der Manifestdatei keine Aktivitäten mit Intent-Filtern vom Typ CATEGORY_LAUNCHER
oder ACTION_MAIN
hinzu.
Aktivitäten wie die im folgenden Beispiel sind in der Regel auf ein Smartphone oder ein anderes Mobilgerät ausgerichtet. Deklarieren Sie diese Aktivitäten im Modul, in dem die Smartphone-App erstellt wird, nicht im Modul, in 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 platzieren, das Sie für Ihre Smartphone-App und Ihr Automodul gemeinsam verwenden. Wenn Sie diesen Ansatz verwenden, müssen Sie Ihr Automotive-Modul so aktualisieren, dass es das freigegebene Modul enthält, wie im folgenden Snippet gezeigt:
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 Medienbrowserdienst können Sie auch für Ihr Auto optimierte Einstellungen und Anmeldeaktivitäten für Ihre Android Automotive OS-App bereitstellen. Mit diesen Aktivitäten können Sie App-Funktionen bereitstellen, 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ätsworkflows
Das folgende Diagramm zeigt, wie ein Nutzer mit Ihren Einstellungen und Anmeldeaktivitäten unter Android Automotive OS interagiert:
Ablenkungen in den Einstellungen und Anmeldeaktivitäten vermeiden
Damit Ihre Einstellungen und/oder Anmeldeaktivitäten nur verwendet werden können, wenn das Fahrzeug des Nutzers geparkt ist, prüfen Sie, ob die <activity>
-Elemente das folgende <meta-data>
-Element enthalten. Ihre App wird bei 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 für Fahrzeuge optimierte Einstellungsaktivität hinzufügen, damit Nutzer die Einstellungen für Ihre App in ihrem Auto konfigurieren können. Ihre Einstellungen können auch andere Workflows umfassen, z. B. die Anmeldung oder Abmeldung in einem Nutzerkonto oder das Wechseln zwischen Nutzerkonten. Denken Sie daran, dass diese Aktivität nur von einer App ausgelöst wird, die auf Android Automotive OS ausgeführt wird. Smartphone-Apps, die mit Android Auto verbunden sind, nutzen sie nicht.
Einstellungenaktivität deklarieren
Sie müssen die Einstellungen 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>
Aktivitätseinstellungen implementieren
Wenn ein Nutzer Ihre App startet, erkennt Android Automotive OS die von Ihnen deklarierte Einstellungsaktivität und zeigt eine Aufforderung wie ein Symbol an.
Der Nutzer kann auf das Symbol tippen oder es über das Display des Autos auswählen, um zur Aktivität zu gelangen. Android Automotive OS sendet die Intent ACTION_APPLICATION_PREFERENCES
, die Ihre App auffordert, die Einstellungen zu starten.
Im Rest dieses Abschnitts wird gezeigt, wie Sie Code aus der Beispiel-App „Universal Android Music Player“ (UAMP) anpassen, um eine Einstellungsaktivität für Ihre App zu implementieren.
Laden Sie zuerst den Beispielcode herunter:
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git
# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME
# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
So implementieren Sie Ihre Aktivität:
- Kopieren Sie den Ordner
automotive/automotive-lib
in Ihr Automotive-Modul. - Definieren Sie einen Einstellungsbaum wie in
automotive/src/main/res/xml/preferences.xml
. Implementieren Sie einen
PreferenceFragmentCompat
, in dem Ihre Einstellungen angezeigt werden. Weitere Informationen finden Sie in den DateienSettingsFragment.kt
undSettingsActivity.kt
in UAMP sowie im Leitfaden zu den Android-Einstellungen.
Beachten Sie bei der Implementierung Ihrer Einstellungen die folgenden Best Practices für die Verwendung einiger Komponenten in der Einstellungsbibliothek:
- Die Einstellungen dürfen unterhalb der Hauptansicht nicht mehr als zwei Ebenen haben.
- Verwenden Sie keine
DropDownPreference
. Verwenden Sie stattdessen einListPreference
. - Organisationskomponenten:
PreferenceScreen
- Dies muss die oberste Ebene des Einstellungsbaums sein.
PreferenceCategory
- Wird verwendet, um
Preference
-Objekte zu gruppieren. - Fügen Sie eine
title
hinzu.
- Wird verwendet, um
- Fügen Sie allen folgenden Komponenten
key
undtitle
hinzu. Sie können auch einensummary
, einenicon
oder beides angeben:Preference
- Passen Sie die Logik im
onPreferenceTreeClick()
-Callback IhrerPreferenceFragmentCompat
-Implementierung an.
- Passen Sie die Logik im
CheckBoxPreference
- Für bedingten Text kann
summaryOn
odersummaryOff
anstelle vonsummary
verwendet werden.
- Für bedingten Text kann
SwitchPreference
- Für bedingten Text kann
summaryOn
odersummaryOff
anstelle vonsummary
verwendet werden. - Kann
switchTextOn
oderswitchTextOff
sein.
- Für bedingten Text kann
SeekBarPreference
- Fügen Sie
min
,max
unddefaultValue
hinzu.
- Fügen Sie
EditTextPreference
- Fügen Sie
dialogTitle
,positiveButtonText
undnegativeButtonText
hinzu. - Kann
dialogMessage
und/oderdialogLayoutResource
haben.
- Fügen Sie
com.example.android.uamp.automotive.lib.ListPreference
- Stammt hauptsächlich von
ListPreference
. - Wird verwendet, um eine Liste mit
Preference
-Objekten zur Einzelauswahl anzuzeigen. - Muss ein Array von
entries
und entsprechendenentryValues
haben.
- Stammt hauptsächlich von
com.example.android.uamp.automotive.lib.MultiSelectListPreference
- Stammt hauptsächlich aus
MultiSelectListPreference
- Wird verwendet, um eine Multiple-Choice-Liste von
Preference
-Objekten anzuzeigen. - Muss ein Array von
entries
und entsprechendenentryValues
haben.
- Stammt hauptsächlich aus
Anmeldeaktivität hinzufügen
Wenn sich Nutzer in Ihrer App anmelden müssen, bevor sie sie verwenden können, können Sie eine für Fahrzeuge optimierte Anmeldeaktivität hinzufügen, die die Anmeldung und Abmeldung in Ihrer App verwaltet. Sie können auch einer Aktivität für Einstellungen Anmelde- und Abmeldeabläufe hinzufügen. Verwenden Sie jedoch eine spezielle Anmeldeaktivität, wenn Ihre App erst verwendet werden kann, wenn sich ein Nutzer anmeldet. Diese Aktivität wird nur von einer App ausgelöst, die unter Android Automotive OS ausgeführt wird. Smartphone-Apps, die mit Android Auto verbunden sind, nutzen sie nicht.
Anmeldung beim Start der App erforderlich machen
Wenn sich ein Nutzer anmelden muss, bevor er Ihre App verwenden kann, muss Ihr Medienbrowserdienst Folgendes tun:
- Sende in der
onLoadChildren()
-Methode deines Dienstes dasnull
-Ergebnis mit der MethodesendResult()
. - Lege mit der Methode
setState()
den WertSTATE_ERROR
fürPlaybackStateCompat
der Mediensitzung fest. Dadurch wird Android Automotive OS mitgeteilt, dass bis zur Behebung des Fehlers keine weiteren Vorgänge ausgeführt werden können. - Lege den
PlaybackStateCompat
-Fehlercode der Mediensitzung aufERROR_CODE_AUTHENTICATION_EXPIRED
fest. Dadurch wird Android Automotive OS mitgeteilt, dass sich der Nutzer authentifizieren muss. - Lege die
PlaybackStateCompat
-Fehlermeldung der Mediensitzung mit der MethodesetErrorMessage()
fest. Da diese Fehlermeldung an den Nutzer gerichtet ist, muss sie für die aktuelle Sprache des Nutzers lokalisiert werden. Lege die
PlaybackStateCompat
-Extras der Mediensitzung mit der MethodesetExtras()
fest. Fügen Sie die folgenden beiden Schlüssel hinzu:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: ein String, der auf der Schaltfläche angezeigt wird, über die der Anmeldevorgang gestartet wird. Da dieser String für Nutzer sichtbar ist, müssen Sie ihn für die aktuelle Sprache des Nutzers lokalisieren.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: EinPendingIntent
, über das der Nutzer zu Ihren Anmeldeaktivitäten weitergeleitet wird, wenn er auf die Schaltfläche tippt, auf die diePLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
verweist.
Im folgenden Code-Snippet wird gezeigt, wie Sie in Ihrer App festlegen können, dass sich Nutzer 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, setzen Sie PlaybackStateCompat
auf einen anderen Status als STATE_ERROR
zurück und leiten Sie den Nutzer dann zurück zu Android Automotive OS, indem Sie die Methode finish()
der Aktivität aufrufen.
Anmeldeaktivitäten implementieren
Google bietet eine Vielzahl von Identitätstools, mit denen Sie Nutzern die Anmeldung in Ihrer App in ihrem Auto erleichtern können. 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 eine nahtlose Anmeldung für Nutzer zu ermöglichen.
Mit den folgenden Tools können Sie die Anmeldung für Nutzer vereinfachen, die sich zuvor auf einem anderen Gerät angemeldet haben:
- Anmeldung/Registrierung über One Tap:Wenn Sie One Tap bereits für andere Geräte wie Ihre Smartphone-App implementiert haben, implementieren Sie es auch für Ihre Android Automotive OS-App, 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 auch für Ihre Android Automotive OS-App, um bestehende Google Log-in-Nutzer zu unterstützen.
- Autofill mit Google:Wenn Nutzer „Autofill mit Google“ auf ihren anderen Android-Geräten aktiviert haben, werden ihre Anmeldedaten im Google Passwortmanager gespeichert. Wenn sich diese Nutzer in Ihrer Android Automotive OS-App anmelden, werden mit „Automatisches Ausfüllen“ relevante gespeicherte Anmeldedaten vorgeschlagen. Für die Verwendung von Autofill mit Google ist keine Anwendungsentwicklung erforderlich. App-Entwickler können jedoch ihre Apps für bessere Ergebnisse optimieren. Das Autofill-System von 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 mit Authentifizierung müssen aus den folgenden Gründen AccountManager verwenden:
- Verbesserte Nutzerfreundlichkeit und einfachere Kontoverwaltung:Nutzer können alle ihre Konten über das Kontomenü in den Systemeinstellungen ganz einfach verwalten, einschließlich Anmeldung und Abmeldung.
- Gastfunktionen:Autos sind gemeinsam genutzte Geräte. OEMs können also Gastfunktionen im Fahrzeug aktivieren, bei denen keine Konten hinzugefügt werden können. Diese Einschränkung wird durch die Verwendung von
DISALLOW_MODIFY_ACCOUNTS
fürAccountManager
erreicht.
Berechtigungen
Wenn Sie vom Nutzer Berechtigungen anfordern müssen, verwenden Sie denselben Ablauf wie bei der Authentifizierungsaktivität oder der Einstellungen-Aktivität im Diagramm zu Aktivitätsabläufen in einem vorherigen Abschnitt.
Hinweise zum Medienhost lesen
Je nach Systemanwendung (einschließlich ihrer Version), die eine Verbindung zu Ihrem Medienbrowserdienst herstellt, erhält Ihre Anwendung möglicherweise die folgenden zusätzlichen Funktionen:
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 in der PlaybackStateCompat
fest. Dadurch wird in der Benutzeroberfläche ein Toast
angezeigt.
Wenn ein Fehler auftritt, die Wiedergabe aber fortgesetzt werden kann, schlage einen nicht schwerwiegenden Fehler vor. So kann ein Nutzer beispielsweise Musik in einer App abspielen, bevor er sich anmeldet, sich aber erst anmelden müssen, um einen Titel zu überspringen. Wenn du einen nicht fatalen Fehler verwendest, kann das System dem Nutzer vorschlagen, sich anzumelden, ohne die Wiedergabe des aktuellen Medienelements zu unterbrechen.
Wenn Sie einen nicht schwerwiegenden Fehler ausgeben, belassen Sie den Rest der PlaybackStateCompat
unverändert, mit Ausnahme des Fehlercodes und der Fehlermeldung. So kann die Wiedergabe des aktuellen Medienelements 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 verfügbar sind, setze den Status von PlaybackStateCompat
auf STATE_ERROR
.
Löschen Sie bei nachfolgenden Aktualisierungen Ihrer PlaybackStateCompat
alle Fehlercodes und Fehlermeldungen, um zu vermeiden, dass mehrere Warnungen für denselben Fehler angezeigt werden.
Wenn Sie einen Navigationsbaum nicht laden können, z. B. wenn eine Authentifizierung erforderlich ist und der Nutzer nicht angemeldet ist, senden Sie einen leeren Navigationsbaum. Gib dazu für den Stammknoten des Medienelements ein Nullergebnis von onLoadChildren()
zurück. In diesem Fall wird auf dem System ein Vollbildfehler mit der in der PlaybackStateCompat
festgelegten Fehlermeldung angezeigt.
Umsetzbare Fehler
Wenn ein Fehler behoben werden kann, legen Sie zusätzlich die folgenden beiden Extras in PlaybackStateCompat
fest:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: Label für die Schaltfläche, auf die geklickt werden muss, um den Fehler zu beheben. Da dieser String für Nutzer sichtbar ist, müssen Sie ihn für die aktuelle Sprache des Nutzers lokalisieren.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: DerPendingIntent
, der von der Schaltfläche ausgeführt wird, um den Fehler zu beheben, z. B. durch Starten Ihrer Anmeldeaktivitäten.
Fehler, die behoben werden können, werden als Dialog
angezeigt und können nur von Nutzern behoben werden, wenn das Auto angehalten ist.
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 angemeldet oder abgemeldet
- Unterschiedliche Status des Antriebs, z. B. „Geparkt“ oder „In Bewegung“
- Verschiedene Verbindungsstatus, z. B. online oder offline
Weitere Überlegungen
Beachten Sie bei der Entwicklung Ihrer Android Automotive OS-App außerdem Folgendes:
Offlineinhalte
Implementieren Sie gegebenenfalls die Unterstützung für die Offlinewiedergabe. Autos mit Android Automotive OS haben voraussichtlich eine eigene Datenverbindung. Das bedeutet, dass ein Datentarif in den Kosten des Fahrzeugs enthalten ist oder vom Nutzer bezahlt wird. Autos sollen jedoch auch eine variablere Konnektivität als Mobilgeräte haben.
Folgende Punkte sollten Sie bei der Offline-Supportstrategie beachten:
- Inhalte sollten am besten heruntergeladen werden, während Ihre App verwendet wird.
- Gehen Sie nicht davon aus, dass WLAN verfügbar ist. Ein Auto befindet sich möglicherweise nie in Reichweite eines WLANs oder der OEM hat das WLAN zugunsten eines Mobilfunknetzes deaktiviert.
- Es ist zwar in Ordnung, die Inhalte, die Nutzer voraussichtlich verwenden werden, intelligent im Cache zu speichern, wir empfehlen jedoch, dass Nutzer dieses Verhalten über die 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, für die eine WebView verwendet wird, müssen außerhalb der WebView eine Option zum Schließen oder Zurückgehen haben.
Hier einige Beispiele für zulässige Anwendungsfälle für WebViews:
- Die Anzeige Ihrer Datenschutzerklärung, Nutzungsbedingungen oder anderer rechtlicher Links in Ihren Einstellungen
- Ein webbasierter Ablauf bei der Anmeldung.
Wenn Sie eine WebView verwenden, können Sie JavaScript aktivieren.
WebView schützen
Treffen Sie alle möglichen Vorkehrungen, damit Ihre WebView nicht als Eingangspunkt in das Internet dient. Im folgenden Code-Snippet wird gezeigt, wie Sie die WebView auf die URL sperren, die im loadUrl()
-Aufruf verwendet wird, und Weiterleitungen verhindern. Wir empfehlen Ihnen dringend, solche Sicherheitsvorkehrungen nach Möglichkeit zu implementieren, z. B. wenn Sie rechtlich relevante Links anzeigen.
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 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 Ihren aktuellen Paketnamen wiederverwenden, hat Ihre App 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 anderes an der Android Automotive OS-App arbeitet, kann es sinnvoll sein, separate Paketnamen zu verwenden und jedes Team seinen eigenen 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 dem Beibehalten des aktuellen Paketnamens und der Verwendung eines neuen Paketnamens zusammengefasst:
Funktion | Gleicher Paketname | Neuer Paketname |
---|---|---|
Store-Eintrag | Single | Mehrere |
Gespiegelte Installation | Ja: „Schnelle App-Wiederinstallation“ während des Einrichtungsassistenten | Nein |
Play Store-Überprüfungsprozess | Blockierung von Überprüfungen: Wenn die Überprüfung für ein APK fehlschlägt, werden auch andere APKs blockiert, die im selben Release eingereicht wurden. | Individuelle Rezensionen |
Statistiken, Messwerte und Vitaldaten | Kombiniert: Sie können nach datenfiltern, die speziell für die Automobilbranche relevant sind. | Aufheben |
Indexierung und Suchrang | Auf dem aktuellen Stand aufbauen | Kein Übertrag |
Einbindung in andere Apps | Höchstwahrscheinlich sind keine Änderungen erforderlich, vorausgesetzt, der Mediencode wird von beiden APKs gemeinsam verwendet. | 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?
Für Apps, die auf Android 10 (API-Level 29) oder höher ausgerichtet sind, lesen Sie die Dokumentation zum Teilen von Audioeingabe. Das ist vor API-Level 29 nicht möglich.
Auf welche Auto-APIs können wir zugreifen und wie?
Sie sind auf die APIs beschränkt, die vom OEM freigegeben 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 Properties finden Sie im Quellcode oder in der Referenzdokumentation. Wenn die Property mit @SystemApi
annotiert ist, ist sie auf vorinstallierte System-Apps beschränkt.
Welche Audio-Codecs werden unterstützt?
Weitere Informationen finden Sie in der Android-CDD unter Audio-Codec-Details.
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 dennoch für die Einhaltung aller Qualitätsanforderungen für Auto-Apps verantwortlich.
Kann ich einen Dienst im Vordergrund verwenden?
Der einzige zulässige Anwendungsfall für einen Dienst im Vordergrund ist das Herunterladen von Inhalten zur Offlinenutzung. 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 zur Veröffentlichung Ihrer Android Automotive OS-App über die Google Play Console finden Sie unter Über Autos vertreiben.
Weitere Informationen
Weitere Informationen zu Android Automotive OS finden Sie in den folgenden zusätzlichen Ressourcen.
Produktproben
Leitfäden
- Design für Android for Cars
- Test-App für Mediencontroller verwenden
- Benachrichtigungen unter Android Automotive OS
- Qualitätsrichtlinien für Android-Apps für Autos
Blogs
Videos
- How to Build Media Apps for Cars (Android Dev Summit '19)
- Android-Apps für Autos entwickeln (Google I/O'19)
Medienproblem mit Android Automotive OS 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. Achten Sie darauf, in der Vorlage für Probleme alle angeforderten Informationen anzugeben.
Bevor Sie ein neues Problem melden, prüfen Sie, ob es bereits in der Liste der Probleme aufgeführt ist. Sie können Probleme abonnieren und dafür stimmen, indem Sie im Tracker auf den Stern für ein Problem klicken. Weitere Informationen finden Sie unter Probleme abonnieren.