Auf dieser Seite werden die verschiedenen Funktionen der Car App Library beschrieben, mit denen Sie die Funktionen Ihrer App für die detaillierte Streckennavigation implementieren können.
Navigationsunterstützung in Ihrem Manifest deklarieren
Ihre Navigations-App muss die androidx.car.app.category.NAVIGATION
Kategorie „Car App“ im Intent-Filter ihrer CarAppService
deklarieren:
<application>
...
<service
...
android:name=".MyNavigationCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.NAVIGATION"/>
</intent-filter>
</service>
...
</application>
Navigationsabsichten unterstützen
Wenn Sie Navigationsabsichten für Ihre App unterstützen möchten, einschließlich solcher, die von Google Assistant über eine Sprachabfrage stammen, muss Ihre App den CarContext.ACTION_NAVIGATE
-Intent in Session.onCreateScreen
und Session.onNewIntent
verarbeiten.
Weitere Informationen zum Format der Intents finden Sie in der Dokumentation zu CarContext.startCarApp
.
Auf die Navigationsvorlagen zugreifen
Navigations-Apps können auf die folgenden Vorlagen zugreifen, die eine Oberfläche im Hintergrund mit der Karte und während der aktiven Navigation detaillierte Wegbeschreibungen anzeigen.
NavigationTemplate
: Beim aktiven Navigieren werden auch eine optionale Informationsmeldung und Fahrtzeitangaben angezeigt.MapWithContentTemplate
: Eine Vorlage, mit der eine App Kartenkacheln mit Inhalten (z. B. einer Liste) rendern kann. Die Inhalte werden in der Regel als Overlay über den Kartenkacheln gerendert. Die Karte ist sichtbar und stabile Bereiche passen sich an die Inhalte an.
Weitere Informationen dazu, wie Sie die Benutzeroberfläche Ihrer Navigations-App mithilfe dieser Vorlagen entwerfen, finden Sie unter Navigations-Apps.
Damit Ihre App auf die Navigationsvorlagen zugreifen kann, muss sie in der Datei AndroidManifest.xml
die Berechtigung androidx.car.app.NAVIGATION_TEMPLATES
deklarieren:
<manifest ...>
...
<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
...
</manifest>
Für das Zeichnen von Karten ist eine zusätzliche Berechtigung erforderlich.
Zur Vorlage „MapWithContentTemplate“ migrieren
Ab API-Level 7 der Car App API werden die MapTemplate
-, PlaceListNavigationTemplate
- und RoutePreviewNavigationTemplate
-Versionen eingestellt. Verworfene Vorlagen werden weiterhin unterstützt. Wir empfehlen jedoch dringend, zu MapWithContentTemplate
zu migrieren.
Die Funktionen dieser Vorlagen können mithilfe der MapWithContentTemplate
implementiert werden. Die folgenden Snippets dienen als Beispiele:
MapTemplate
Kotlin
// MapTemplate (deprecated) val template = MapTemplate.Builder() .setPane(paneBuilder.build()) .setActionStrip(actionStrip) .setHeader(header) .setMapController(mapController) .build() // MapWithContentTemplate val template = MapWithContentTemplate.Builder() .setContentTemplate( PaneTemplate.Builder(paneBuilder.build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController(mapController) .build()
Java
// MapTemplate (deprecated) MapTemplate template = new MapTemplate.Builder() .setPane(paneBuilder.build()) .setActionStrip(actionStrip) .setHeader(header) .setMapController(mapController) .build(); // MapWithContentTemplate MapWithContentTemplate template = new MapWithContentTemplate.Builder() .setContentTemplate(new PaneTemplate.Builder(paneBuilder.build()) .setHeader(header) build()) .setActionStrip(actionStrip) .setMapController(mapController) .build();
PlaceListNavigationTemplate
Kotlin
// PlaceListNavigationTemplate (deprecated) val template = PlaceListNavigationTemplate.Builder() .setItemList(itemListBuilder.build()) .setHeader(header) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build() // MapWithContentTemplate val template = MapWithContentTemplate.Builder() .setContentTemplate( ListTemplate.Builder() .setSingleList(itemListBuilder.build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController( MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build()
Java
// PlaceListNavigationTemplate (deprecated) PlaceListNavigationTemplate template = new PlaceListNavigationTemplate.Builder() .setItemList(itemListBuilder.build()) .setHeader(header) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build(); // MapWithContentTemplate MapWithContentTemplate template = new MapWithContentTemplate.Builder() .setContentTemplate(new ListTemplate.Builder() .setSingleList(itemListBuilder.build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController(new MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build();
RoutePreviewNavigationTemplate
Kotlin
// RoutePreviewNavigationTemplate (deprecated) val template = RoutePreviewNavigationTemplate.Builder() .setItemList( ItemList.Builder() .addItem( Row.Builder() .setTitle(title) .build()) .build()) .setHeader(header) .setNavigateAction( Action.Builder() .setTitle(actionTitle) .setOnClickListener { ... } .build()) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build() // MapWithContentTemplate val template = MapWithContentTemplate.Builder() .setContentTemplate( ListTemplate.Builder() .setSingleList( ItemList.Builder() .addItem( Row.Builder() .setTitle(title) .addAction( Action.Builder() .setTitle(actionTitle) .setOnClickListener { ... } .build()) .build()) .build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController( MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build()
Java
// RoutePreviewNavigationTemplate (deprecated) RoutePreviewNavigationTemplate template = new RoutePreviewNavigationTemplate.Builder() .setItemList(new ItemList.Builder() .addItem(new Row.Builder() .setTitle(title)) .build()) .build()) .setHeader(header) .setNavigateAction(new Action.Builder() .setTitle(actionTitle) .setOnClickListener(() -> { ... }) .build()) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build(); // MapWithContentTemplate MapWithContentTemplate template = new MapWithContentTemplate.Builder() .setContentTemplate(new ListTemplate.Builder() .setSingleList(new ItemList.Builder() .addItem(new Row.Builder() .setTitle(title)) .addAction(new Action.Builder() .setTitle(actionTitle) .setOnClickListener(() -> { ... }) .build()) .build()) .build())) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController(new MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build();
Navigationsmetadaten senden
Navigations-Apps müssen zusätzliche Navigationsmetadaten an den Host senden. Der Host verwendet die Informationen, um Informationen an die Haupteinheit des Fahrzeugs weiterzuleiten und zu verhindern, dass Navigationsanwendungen auf gemeinsame Ressourcen zugreifen.
Navigationsmetadaten werden über den NavigationManager
-Autodienst bereitgestellt, der über den CarContext
aufgerufen werden kann:
Kotlin
val navigationManager = carContext.getCarService(NavigationManager::class.java)
Java
NavigationManager navigationManager = carContext.getCarService(NavigationManager.class);
Navigation starten, beenden und anhalten
Damit der Host mehrere Navigations-Apps, Routing-Benachrichtigungen und Fahrzeugclusterdaten verwalten kann, muss er den aktuellen Navigationsstatus kennen. Wenn ein Nutzer die Navigation startet, rufe NavigationManager.navigationStarted
auf.
Rufen Sie NavigationManager.navigationEnded
auf, wenn die Navigation endet, z. B. wenn der Nutzer sein Ziel erreicht oder die Navigation abbricht.
Rufe NavigationManager.navigationEnded
nur auf, wenn der Nutzer die Navigation beendet hat. Wenn Sie beispielsweise die Route mitten in einer Fahrt neu berechnen möchten, verwenden Sie stattdessen Trip.Builder.setLoading(true)
.
Gelegentlich benötigt der Host eine App, um die Navigation zu beenden, und ruft onStopNavigation
in einem NavigationManagerCallback
-Objekt auf, das von Ihrer App über NavigationManager.setNavigationManagerCallback
bereitgestellt wird.
Die App darf dann keine Informationen zur nächsten Abbiegung mehr auf dem Clusterdisplay, keine Navigationsbenachrichtigungen und keine Sprachnavigation mehr senden.
Informationen zur Fahrt aktualisieren
Während der aktiven Navigation NavigationManager.updateTrip
aufrufen
Die in diesem Aufruf bereitgestellten Informationen können vom Kombiinstrument und dem Heads-up-Display des Fahrzeugs verwendet werden. Je nach Fahrzeug werden dem Nutzer nicht alle Informationen angezeigt.
Auf der Desktop-Headunit (DHU) wird beispielsweise Step
angezeigt, das Trip
hinzugefügt wurde, aber nicht die Informationen zu Destination
.
Auf dem Cluster-Display zeichnen
Für eine optimale Nutzererfahrung sollten Sie nicht nur grundlegende Metadaten auf dem Kombiinstrument des Fahrzeugs anzeigen. Ab der Car App API-Ebene 6 können Navigations-Apps eigene Inhalte direkt auf dem Kombiinstrument (in unterstützten Fahrzeugen) rendern. Dabei gelten die folgenden Einschränkungen:
- Die Cluster Display API unterstützt keine Eingabesteuerelemente
- Qualitätsrichtlinie für Auto-Apps
NF-9
: Das Cluster-Display darf nur Kartenkacheln enthalten. Optional kann auf diesen Kacheln eine aktive Navigationsroute angezeigt werden. - Die Cluster Display API unterstützt nur die Verwendung von
NavigationTemplate
.- Im Gegensatz zu Hauptdisplays werden auf Clusterdisplays möglicherweise nicht immer alle
NavigationTemplate
UI-Elemente wie detaillierte Wegbeschreibungen, ETA-Karten und Aktionen angezeigt. Kartenkacheln sind das einzige Element der Benutzeroberfläche, das immer angezeigt wird.
- Im Gegensatz zu Hauptdisplays werden auf Clusterdisplays möglicherweise nicht immer alle
Clusterunterstützung deklarieren
Damit die Hostanwendung weiß, dass Ihre App das Rendering auf Clusterdisplays unterstützt, müssen Sie dem <intent-filter>
Ihrer CarAppService
ein androidx.car.app.category.FEATURE_CLUSTER
<category>
-Element hinzufügen, wie im folgenden Snippet gezeigt:
<application> ... <service ... android:name=".MyNavigationCarAppService" android:exported="true"> <intent-filter> <action android:name="androidx.car.app.CarAppService" /> <category android:name="androidx.car.app.category.NAVIGATION"/> <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/> </intent-filter> </service> ... </application>
Lebenszyklus- und Statusverwaltung
Ab API-Level 6 bleibt der Lebenszyklusablauf der Auto-App unverändert. CarAppService::onCreateSession
nimmt jetzt jedoch einen Parameter vom Typ SessionInfo
an, der zusätzliche Informationen zur erstellten Session
enthält, nämlich den Anzeigetyp und die unterstützten Vorlagen.
Apps können entweder dieselbe Session
-Klasse verwenden, um sowohl den Cluster als auch das Hauptdisplay zu verwalten, oder displayspezifische Sessions
erstellen, um das Verhalten auf jedem Display anzupassen (wie im folgenden Snippet gezeigt).
Kotlin
override fun onCreateSession(sessionInfo: SessionInfo): Session { return if (sessionInfo.displayType == SessionInfo.DISPLAY_TYPE_CLUSTER) { ClusterSession() } else { MainDisplaySession() } }
Java
@Override @NonNull public Session onCreateSession(@NonNull SessionInfo sessionInfo) { if (sessionInfo.getDisplayType() == SessionInfo.DISPLAY_TYPE_CLUSTER) { return new ClusterSession(); } else { return new MainDisplaySession(); } }
Es gibt keine Garantie dafür, wann oder ob das Clusterdisplay bereitgestellt wird. Es ist auch möglich, dass das Cluster-Session
das einzige Session
ist (z. B. wenn der Nutzer das Hauptdisplay zu einer anderen App gewechselt hat, während in Ihrer App aktiv navigiert wird). Die „Standard“-Vereinbarung besagt, dass die App die Kontrolle über das Clusterdisplay erst nach dem Aufruf von NavigationManager::navigationStarted
erhält. Es ist jedoch möglich, dass der App das Cluster-Display zur Verfügung gestellt wird, während keine aktive Navigation stattfindet, oder dass es nie zur Verfügung gestellt wird. Ihre App muss diese Szenarien bewältigen, indem sie den Inaktivitätsstatus der Kartenkacheln Ihrer App rendert.
Der Host erstellt separate Binder- und CarContext
-Instanzen pro Session
. Das bedeutet, dass bei der Verwendung von Methoden wie ScreenManager::push
oder Screen::invalidate
nur die Session
betroffen ist, von der aus sie aufgerufen werden. Apps sollten eigene Kommunikationskanäle zwischen diesen Instanzen erstellen, wenn eine Session
-übergreifende Kommunikation erforderlich ist (z. B. mithilfe von Broadcasts, einem freigegebenen Singleton oder einer anderen Methode).
Clustersupport testen
Sie können Ihre Implementierung sowohl unter Android Auto als auch unter Android Automotive OS testen. Bei Android Auto wird dies dadurch erreicht, dass das Infotainmentsystem so konfiguriert wird, dass es ein sekundäres Cluster-Display emuliert. Bei Android Automotive OS emulieren die generischen Systembilder für API-Ebene 30 und höher ein Cluster-Display.
Reisezeit mit Text oder Symbol anpassen
Wenn Sie die Fahrtzeit mit Text, einem Symbol oder beiden Elementen anpassen möchten, verwenden Sie die Methoden setTripIcon
oder setTripText
der Klasse TravelEstimate.Builder
. Mit TravelEstimate
können Sie in NavigationTemplate
optional Text und Symbole neben oder anstelle der geschätzten Ankunftszeit, der verbleibenden Zeit und der verbleibenden Entfernung festlegen.
Im folgenden Snippet werden setTripIcon
und setTripText
verwendet, um die Reisezeit zu anpassen:
Kotlin
TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...)) ... .setTripIcon(CarIcon.Builder(...).build()) .setTripText(CarText.create(...)) .build()
Java
new TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...)) ... .setTripIcon(CarIcon.Builder(...).build()) .setTripText(CarText.create(...)) .build();
Detaillierte Routenführung
Detaillierte Routenbeschreibungen mit einer häufig aktualisierten Navigationsbenachrichtigung bereitstellen. Damit eine Benachrichtigung auf dem Autodisplay als Navigationsbenachrichtigung behandelt wird, muss der Ersteller der Benachrichtigung Folgendes tun:
- Markiere die Benachrichtigung mit der Methode
NotificationCompat.Builder.setOngoing
als in Bearbeitung. - Legen Sie die Kategorie der Benachrichtigung auf
Notification.CATEGORY_NAVIGATION
fest. - Maximieren Sie die Benachrichtigung mit einem
CarAppExtender
.
Im Infobereich unten auf dem Autodisplay wird eine Navigationsbenachrichtigung angezeigt. Wenn die Prioritätsstufe der Benachrichtigung auf IMPORTANCE_HIGH
festgelegt ist, wird sie auch als Vorabbenachrichtigung angezeigt.
Wenn die Wichtigkeit nicht mit der Methode CarAppExtender.Builder.setImportance
festgelegt wird, wird die Wichtigkeit des Benachrichtigungskanals verwendet.
Die App kann eine PendingIntent
im CarAppExtender
festlegen, die an die App gesendet wird, wenn der Nutzer auf das HUN oder das Bahn-Widget tippt.
Wenn NotificationCompat.Builder.setOnlyAlertOnce
mit dem Wert true
aufgerufen wird, wird eine Benachrichtigung mit hoher Wichtigkeit nur einmal im HUN angezeigt.
Das folgende Snippet zeigt, wie eine Navigationsbenachrichtigung erstellt wird:
Kotlin
NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) ... .setOnlyAlertOnce(true) .setOngoing(true) .setCategory(NotificationCompat.CATEGORY_NAVIGATION) .extend( CarAppExtender.Builder() .setContentTitle(carScreenTitle) ... .setContentIntent( PendingIntent.getBroadcast( context, ACTION_OPEN_APP.hashCode(), Intent(ACTION_OPEN_APP).setComponent( ComponentName(context, MyNotificationReceiver::class.java)), 0)) .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH) .build()) .build()
Java
new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) ... .setOnlyAlertOnce(true) .setOngoing(true) .setCategory(NotificationCompat.CATEGORY_NAVIGATION) .extend( new CarAppExtender.Builder() .setContentTitle(carScreenTitle) ... .setContentIntent( PendingIntent.getBroadcast( context, ACTION_OPEN_APP.hashCode(), new Intent(ACTION_OPEN_APP).setComponent( new ComponentName(context, MyNotificationReceiver.class)), 0)) .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH) .build()) .build();
Aktualisieren Sie die TBT-Benachrichtigung regelmäßig bei Entfernungsänderungen, damit das Bahn-Widget aktualisiert wird und die Benachrichtigung nur als HUN angezeigt wird.
Sie können das HUN-Verhalten steuern, indem Sie die Wichtigkeit der Benachrichtigung mit CarAppExtender.Builder.setImportance
festlegen. Wenn Sie die Wichtigkeit auf IMPORTANCE_HIGH
festlegen, wird ein HUN angezeigt. Wenn Sie einen anderen Wert festlegen, wird nur das Schiene-Widget aktualisiert.
Inhalte von „PlaceListNavigationTemplate“ aktualisieren
Sie können es Fahrern ermöglichen, Inhalte durch Tippen auf eine Schaltfläche zu aktualisieren, während sie Listen mit Orten durchsuchen, die mit PlaceListNavigationTemplate
erstellt wurden.
Wenn Sie die Listenaktualisierung aktivieren möchten, implementieren Sie die Methode onContentRefreshRequested
der OnContentRefreshListener
-Oberfläche und legen Sie mit PlaceListNavigationTemplate.Builder.setOnContentRefreshListener
den Listener in der Vorlage fest.
Im folgenden Snippet wird gezeigt, wie der Listener in der Vorlage festgelegt wird:
Kotlin
PlaceListNavigationTemplate.Builder() ... .setOnContentRefreshListener { // Execute any desired logic ... // Then call invalidate() so onGetTemplate() is called again invalidate() } .build()
Java
new PlaceListNavigationTemplate.Builder() ... .setOnContentRefreshListener(() -> { // Execute any desired logic ... // Then call invalidate() so onGetTemplate() is called again invalidate(); }) .build();
Die Schaltfläche „Aktualisieren“ wird nur im Header der PlaceListNavigationTemplate
angezeigt, wenn der Listener einen Wert hat.
Wenn der Nutzer auf die Schaltfläche „Aktualisieren“ klickt, wird die Methode onContentRefreshRequested
deiner OnContentRefreshListener
-Implementierung aufgerufen. Rufen Sie innerhalb von onContentRefreshRequested
die Methode Screen.invalidate
auf.
Der Host ruft dann die Methode Screen.onGetTemplate
deiner App auf, um die Vorlage mit den aktualisierten Inhalten abzurufen. Weitere Informationen zum Aktualisieren von Vorlagen finden Sie unter Inhalte einer Vorlage aktualisieren. Solange die nächste von onGetTemplate
zurückgegebene Vorlage vom selben Typ ist, wird sie als Aktualisierung gezählt und nicht auf das Vorlagenkontingent angerechnet.
Audionavigation
Damit Navigationsanweisungen über die Autolautsprecher abgespielt werden können, muss Ihre App den Audiofokus anfordern. Legen Sie als Teil Ihrer AudioFocusRequest
die Nutzung auf AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
fest. Legen Sie außerdem die Fokusverstärkung auf AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
fest.
Navigation simulieren
Damit die Navigationsfunktion Ihrer App überprüft werden kann, wenn Sie sie im Google Play Store einreichen, muss Ihre App den Callback NavigationManagerCallback.onAutoDriveEnabled
implementieren. Wenn dieser Rückruf aufgerufen wird, muss Ihre App die Navigation zum ausgewählten Ziel simulieren, wenn der Nutzer mit der Navigation beginnt. Ihre App kann diesen Modus verlassen, sobald der Lebenszyklus der aktuellen Session
den Status Lifecycle.Event.ON_DESTROY
erreicht.
Sie können testen, ob Ihre Implementierung von onAutoDriveEnabled
aufgerufen wird. Führen Sie dazu den folgenden Befehl in einer Befehlszeile aus:
adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE
Das ist im folgenden Beispiel zu sehen:
adb shell dumpsys activity service androidx.car.app.samples.navigation.car.NavigationCarAppService AUTO_DRIVE
Standardmäßige Navigations-App für Autos
In Android Auto entspricht die Standard-Navigations-App für das Auto der zuletzt gestarteten Navigations-App des Nutzers. Die Standard-App empfängt Navigationsabsichten, wenn der Nutzer Navigationsbefehle über Assistant ausführt oder eine andere App eine Absicht sendet, um die Navigation zu starten.
Kontextbezogene Navigationshinweise anzeigen
Alert
zeigt dem Fahrer wichtige Informationen mit optionalen Aktionen an, ohne den Navigationsbildschirm zu verlassen. Für eine optimale Nutzererfahrung arbeitet Alert
innerhalb der NavigationTemplate
, um die Navigationsroute nicht zu blockieren und die Ablenkung des Fahrers zu minimieren.
Alert
ist nur innerhalb der NavigationTemplate
verfügbar.
Wenn Sie den Nutzer außerhalb der NavigationTemplate
benachrichtigen möchten, können Sie eine Push-Benachrichtigung verwenden, wie unter Benachrichtigungen anzeigen beschrieben.
Mit Alert
können Sie beispielsweise:
- Informieren Sie den Fahrer über eine Aktualisierung, die für die aktuelle Navigation relevant ist, z. B. eine Änderung der Verkehrslage.
- Fragen Sie den Fahrer nach aktuellen Informationen zur Navigation, z. B. zur Existenz einer Radarfalle.
- Schlagen Sie eine anstehende Aufgabe vor und fragen Sie, ob der Fahrer sie annimmt, z. B. ob er bereit ist, auf dem Weg jemanden mitzunehmen.
In seiner Grundform besteht ein Alert
aus einem Titel und der Alert
-Dauer. Die Dauer wird durch eine Fortschrittsanzeige dargestellt. Optional können Sie einen Untertitel, ein Symbol und bis zu zwei Action
-Objekte hinzufügen.
Wenn eine Alert
angezeigt wird, wird sie nicht in eine andere Vorlage übernommen, wenn die Interaktion des Fahrers dazu führt, dass die NavigationTemplate
verlassen wird.
Sie bleibt in der ursprünglichen NavigationTemplate
, bis die Alert
abläuft, der Nutzer eine Aktion ausführt oder die Alert
in der App geschlossen wird.
Benachrichtigung erstellen
Verwenden Sie Alert.Builder
, um eine Alert
-Instanz zu erstellen:
Kotlin
Alert.Builder( /*alertId*/ 1, /*title*/ CarText.create("Hello"), /*durationMillis*/ 5000 ) // The fields below are optional .addAction(firstAction) .addAction(secondAction) .setSubtitle(CarText.create(...)) .setIcon(CarIcon.APP_ICON) .setCallback(...) .build()
Java
new Alert.Builder( /*alertId*/ 1, /*title*/ CarText.create("Hello"), /*durationMillis*/ 5000 ) // The fields below are optional .addAction(firstAction) .addAction(secondAction) .setSubtitle(CarText.create(...)) .setIcon(CarIcon.APP_ICON) .setCallback(...) .build();
Wenn Sie auf die Alert
-Abbruch- oder -Schließung achten möchten, erstellen Sie eine Implementierung der Schnittstelle AlertCallback
.
Die AlertCallback
-Aufrufpfade sind:
Wenn die
Alert
ein Zeitlimit überschreitet, ruft der Host die MethodeAlertCallback.onCancel
mit dem WertAlertCallback.REASON_TIMEOUT
auf. Anschließend wird die MethodeAlertCallback.onDismiss
aufgerufen.Wenn der Fahrer auf eine der Aktionsschaltflächen klickt, ruft der Host
Action.OnClickListener
und dannAlertCallback.onDismiss
auf.Wenn
Alert
nicht unterstützt wird, ruft der HostAlertCallback.onCancel
mit dem WertAlertCallback.REASON_NOT_SUPPORTED
auf. Der Host ruftAlertCallback.onDismiss
nicht auf, daAlert
nicht angezeigt wurde.
Dauer der Benachrichtigung konfigurieren
Wählen Sie eine Alert
-Dauer aus, die den Anforderungen Ihrer App entspricht. Die empfohlene Dauer für eine NavigationAlert
beträgt 10 Sekunden. Weitere Informationen finden Sie unter Navigationshinweise.
Benachrichtigung anzeigen
Wenn Sie eine Alert
anzeigen möchten, rufen Sie die Methode AppManager.showAlert
auf, die über die CarContext
Ihrer App verfügbar ist.
// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
- Wenn du
showAlert
mit einemAlert
aufrufst, dessenalertId
mit der ID des aktuell angezeigtenAlert
übereinstimmt, passiert nichts. DieAlert
wird nicht aktualisiert. Wenn Sie eineAlert
aktualisieren möchten, müssen Sie sie mit einer neuenalertId
neu erstellen. - Wenn Sie
showAlert
mit einerAlert
aufrufen, derenalertId
sich von der aktuell angezeigtenAlert
unterscheidet, wird die aktuell angezeigteAlert
geschlossen.
Benachrichtigung schließen
Ein Alert
wird zwar aufgrund eines Zeitlimits oder einer Fahrerinteraktion automatisch geschlossen, Sie können es aber auch manuell schließen, z. B. wenn die Informationen veraltet sind.Alert
Wenn du eine Alert
schließen möchtest, rufe die Methode dismissAlert
mit der alertId
der Alert
auf.
// Dismiss the same alert
carContext.getCarService(AppManager.class).dismissAlert(alert.getId())
Wenn Sie dismissAlert
mit einem alertId
aufrufen, das nicht mit dem aktuell angezeigten Alert
übereinstimmt, passiert nichts. Es wird keine Ausnahme ausgelöst.