Na tej stronie znajdziesz szczegółowe informacje o różnych funkcjach Biblioteki aplikacji samochodowych, których możesz używać do implementowania funkcji nawigacji z naprowadzaniem.
Zadeklaruj obsługę nawigacji w pliku manifestu
Aplikacja do nawigacji musi zadeklarować androidx.car.app.category.NAVIGATION
kategorię aplikacji samochodowej w filtrze intencji CarAppService
:
<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>
Obsługa intencji nawigacji
Aby obsługiwać intencje nawigacyjne w aplikacji, w tym te pochodzące z Asystenta Google za pomocą zapytania głosowego, aplikacja musi obsługiwać intencję CarContext.ACTION_NAVIGATE
w Session.onCreateScreen
i Session.onNewIntent
.
Szczegółowe informacje o formatach intencji znajdziesz w dokumentacji dotyczącej CarContext.startCarApp
.
Otwieranie szablonów nawigacji
Aplikacje do nawigacji mogą korzystać z tych szablonów, które wyświetlają mapę w tle oraz podczas aktywnej nawigacji – wskazówki zakręt po zakręcie.
NavigationTemplate
: wyświetla również opcjonalny komunikat informacyjny i szacunki czasu podróży podczas aktywnej nawigacji.MapWithContentTemplate
: szablon, który umożliwia aplikacji renderowanie kafelków mapy z różnymi rodzajami treści (np. listą). Treści są zwykle renderowane jako nakładka na płytkach mapy, a widoczne obszary mapy i stabilne obszary dostosowują się do treści.
Więcej informacji o projektowaniu interfejsu aplikacji nawigacyjnej za pomocą tych szablonów znajdziesz w artykule Aplikacje nawigacyjne.
Aby uzyskać dostęp do szablonów nawigacji, aplikacja musi zadeklarować uprawnienie androidx.car.app.NAVIGATION_TEMPLATES
w pliku AndroidManifest.xml
:
<manifest ...>
...
<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
...
</manifest>
Aby rysować mapy, wymagane jest dodatkowe uprawnienie.
Migracja do szablonu MapWithContent
Od poziomu interfejsu API 7 dla aplikacji na Car App wartości MapTemplate
, PlaceListNavigationTemplate
i RoutePreviewNavigationTemplate
są wycofane. Nadal będziemy obsługiwać wycofane szablony, ale zdecydowanie zalecamy przejście na MapWithContentTemplate
.
Funkcje, które zapewniają te szablony, można zaimplementować za pomocą MapWithContentTemplate
. Przykłady takich fragmentów kodu:
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();
Przekazywanie metadanych nawigacji
Aplikacje do nawigacji muszą przekazywać dodatkowe metadane nawigacji do hosta. Host używa tych informacji, aby przesyłać informacje do konsoli pojazdu i zapobiegać konfliktom między aplikacjami nawigacyjnymi w przypadku współdzielonych zasobów.
Metadane nawigacji są dostarczane za pomocą usługi NavigationManager
car dostępnej z poziomu CarContext
:
Kotlin
val navigationManager = carContext.getCarService(NavigationManager::class.java)
Java
NavigationManager navigationManager = carContext.getCarService(NavigationManager.class);
Rozpoczynanie, kończenie i zatrzymywanie nawigacji
Aby host mógł zarządzać wieloma aplikacjami do nawigacji, powiadomieniami o nawigacji i danymi klastra pojazdów, musi znać bieżący stan nawigacji. Gdy użytkownik rozpoczyna nawigację, wywołaj funkcję NavigationManager.navigationStarted
.
Podobnie, gdy nawigacja się kończy (np. gdy użytkownik dotrze do celu lub anuluje nawigację), wywołaj NavigationManager.navigationEnded
.
Wywołuj NavigationManager.navigationEnded
tylko wtedy, gdy użytkownik zakończy nawigację. Jeśli na przykład musisz ponownie obliczyć trasę w połowie podróży, użyj polecenia Trip.Builder.setLoading(true)
.
Czasami gospodarz musi zatrzymać nawigację i wywołania onStopNavigation
w obiekcie NavigationManagerCallback
udostępnianym przez Twoją aplikację za pomocą interfejsu NavigationManager.setNavigationManagerCallback
.
Aplikacja musi wtedy przestać wyświetlać informacje o następnym skręcie na wyświetlaczu klastra, powiadomienia nawigacyjne i głosowe wskazówki.
Aktualizowanie informacji o podróży
Podczas aktywnej nawigacji wybierz NavigationManager.updateTrip
.
Informacje przekazane w ramach tego wywołania mogą być używane przez zestaw wskaźników i wyświetlacze HUD pojazdu. W zależności od konkretnego pojazdu nie wszystkie informacje są wyświetlane użytkownikowi.
Na przykład w przypadku jednostki głównej na komputerze (DHU) wyświetlana jest wartość Step
dodana do Trip
, ale nie są wyświetlane informacje Destination
.
Rysowanie na wyświetlaczu grupowym
Aby zapewnić użytkownikom jak najlepsze wrażenia, warto wyświetlać na ekranie konsoli więcej niż podstawowe metadane. Począwszy od interfejsu Car App API w wersji 6 aplikacje nawigacyjne mają możliwość renderowania własnych treści bezpośrednio na wyświetlaczu zespołu (w obsługiwanych pojazdach) z tymi ograniczeniami:
- Interfejs API wyświetlania klastra nie obsługuje elementów sterujących
- Wskazówki dotyczące jakości aplikacji samochodowych
NF-9
: Wyświetlanie grupowe powinno zawierać tylko kafelki mapy. Na tych kartach opcjonalnie można wyświetlić aktywną trasę nawigacji. - Interfejs API wyświetlania klastra obsługuje tylko użycie parametru
NavigationTemplate
.- W odróżnieniu od wyświetlaczy głównych wyświetlacze klastrów mogą nie wyświetlać konsekwentnie wszystkich elementów
NavigationTemplate
interfejsu, takich jak wskazówki dojazdu, karty ETA i czynności. Kafelki mapy to jedyny element interfejsu użytkownika, który jest wyświetlany w sposób spójny.
- W odróżnieniu od wyświetlaczy głównych wyświetlacze klastrów mogą nie wyświetlać konsekwentnie wszystkich elementów
Zadeklaruj obsługę klastra
Aby poinformować aplikację hosta, że Twoja aplikacja obsługuje renderowanie na wyświetlaczach klastra, musisz dodać element androidx.car.app.category.FEATURE_CLUSTER
<category>
do elementu <intent-filter>
aplikacji CarAppService
, jak pokazano w tym fragmencie kodu:
<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>
Zarządzanie stanem i cyklem życia
Począwszy od poziomu 6 interfejsu API przepływ danych aplikacji samochodowej pozostaje taki sam, ale teraz CarAppService::onCreateSession
przyjmuje parametr typu SessionInfo
, który zawiera dodatkowe informacje o tworzonym Session
(a mianowicie typ wyświetlania i zestaw obsługiwanych szablonów).
Aplikacje mogą używać tej samej klasy Session
do obsługi klastra i głównego wyświetlacza lub tworzyć Sessions
dla poszczególnych wyświetlaczy, aby dostosować ich działanie (jak pokazano w tym fragmencie kodu).
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(); } }
Nie ma gwarancji, kiedy i czy wyświetlanie klastra jest dostępne. Możliwe też, że klaster Session
jest jedynym Session
(na przykład użytkownik przełączył wyświetlanie główne na inną aplikację, gdy Twoja aplikacja aktywnie się przewija). „Standardowa” umowa zakłada, że aplikacja uzyskuje kontrolę nad wyświetlaniem klastra dopiero po wywołaniu funkcji NavigationManager::navigationStarted
. Może się jednak zdarzyć, że wyświetlanie klastra jest dostępne w aplikacji, gdy nie ma aktywnej nawigacji, lub że aplikacja nigdy nie ma dostępu do wyświetlania klastra. Twoja aplikacja musi obsługiwać te scenariusze, renderując stan spoczynku kafelków mapy.
Host tworzy oddzielne instancje bindera i CarContext
na potrzeby każdego Session
. Oznacza to, że podczas korzystania z metod takich jak ScreenManager::push
lub Screen::invalidate
wpływa to tylko na Session
, z którego są wywoływane. Jeśli aplikacje potrzebują komunikacji między instancjami, powinny tworzyć własne kanały komunikacji (np. za pomocą transmisji, udostępnionego elementu singleton lub innego rozwiązania).Session
Pomoc dotycząca klastra testowego
Implementację możesz przetestować zarówno w Androidzie Auto, jak i w systemie operacyjnym Android Automotive. W przypadku Androida Auto jest to realizowane przez skonfigurowanie konsoli głównej na komputerze, aby emulować wyświetlacz klastra dodatkowego. W przypadku systemu operacyjnego Android Automotive schematy systemowe dla poziomu interfejsu API 30 i wyższych emulują wyświetlacz klastra.
Dostosowywanie szacowanego czasu podróży za pomocą tekstu lub ikony
Aby dostosować szacowany czas podróży, używając tekstu lub ikony albo obu tych elementów, użyj metod klasy TravelEstimate.Builder
setTripIcon
lub setTripText
. Element NavigationTemplate
używa
TravelEstimate
do opcjonalnego ustawiania tekstu i ikon obok lub zamiast szacunkowego czasu przybycia, pozostałego czasu i pozostałości dystansu.
W tym fragmencie kodu do dostosowania szacowania czasu podróży użyto parametrów setTripIcon
i setTripText
:
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();
wyświetlać powiadomienia o nawigacji zakręt po zakrętem;
Udostępnianie wskazówek dojazdu zakręt po zakręcie za pomocą często aktualizowanego powiadomienia nawigacyjnego. Aby powiadomienie było traktowane jako powiadomienie nawigacyjne na ekranie samochodu, twórca powiadomienia musi:
- Oznacz powiadomienie jako trwające, używając metody
NotificationCompat.Builder.setOngoing
. - Ustaw kategorię powiadomienia na
Notification.CATEGORY_NAVIGATION
. - Rozwiń powiadomienie, klikając
CarAppExtender
.
Powiadomienie o nawigacji wyświetla się w widżecie szyny u dołu ekranu samochodu. Jeśli poziom ważności powiadomienia jest ustawiony naIMPORTANCE_HIGH
, wyświetla się ono również jako powiadomienie ostrzeżenie (HUN).
Jeśli znaczenie nie zostało określone za pomocą metody CarAppExtender.Builder.setImportance
, zostanie użyte znaczenie kanału powiadomień.
Aplikacja może ustawić w CarAppExtender
wartość PendingIntent
, która jest wysyłana do aplikacji, gdy użytkownik kliknie HUN lub widżet na pasku.
Jeśli funkcja NotificationCompat.Builder.setOnlyAlertOnce
jest wywoływana z wartością true
, powiadomienie o wysokiej ważności jest wysyłane tylko raz w usługach HUN.
Ten fragment kodu pokazuje, jak utworzyć powiadomienie nawigacyjne:
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();
Regularnie aktualizuj powiadomienie TBT w przypadku zmian odległości, które aktualizuje widżet kolejowy, i wyświetlaj tylko powiadomienie jako HUN.
Możesz kontrolować działanie funkcji HUN, ustawiając ważność powiadomienia za pomocą parametru CarAppExtender.Builder.setImportance
. Ustawienie wagi na poziomie IMPORTANCE_HIGH
powoduje wyświetlenie HUN. Ustawienie go na dowolną inną wartość spowoduje zaktualizowanie tylko widżetu szyny.
Odświeżanie treści szablonu PlaceListNavigationTemplate
Podczas przeglądania list miejsc utworzonych za pomocą PlaceListNavigationTemplate
możesz umożliwić kierowcom odświeżanie treści jednym kliknięciem.
Aby umożliwić odświeżanie listy, zaimplementuj metodę interfejsu OnContentRefreshListener
onContentRefreshRequested
i użyj metody PlaceListNavigationTemplate.Builder.setOnContentRefreshListener
, aby ustawić listenera w szablonie.
Ten fragment kodu pokazuje, jak ustawić odbiornik w szablonie:
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();
Przycisk odświeżania jest widoczny w nagłówku elementu PlaceListNavigationTemplate
tylko wtedy, gdy listener ma wartość.
Gdy użytkownik kliknie przycisk odświeżania, wywoływana jest metoda onContentRefreshRequested
implementacji OnContentRefreshListener
. W klasie onContentRefreshRequested
wywołaj metodę Screen.invalidate
.
Następnie gospodarz wywołuje metodę Screen.onGetTemplate
aplikacji, aby pobrać szablon z odświeżonymi treściami. Więcej informacji o odświeżaniu szablonów znajdziesz w artykule Odświeżanie zawartości szablonu. Dopóki kolejny szablon zwracany przez funkcję onGetTemplate
jest tego samego typu, jest traktowany jako odświeżenie i nie wlicza się do limitu szablonów.
Wskazówki audio
Aby odtwarzać wskazówki nawigacji przez głośniki samochodu, aplikacja musi poprosić o udzielenie dostępu do dźwięku. W ramach AudioFocusRequest
ustaw użycie jako AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
. Ustaw też wzmocnienie ostrości na AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
.
Symulowanie nawigacji
Aby można było zweryfikować funkcję nawigacji w aplikacji podczas przesyłania jej do Sklepu Google Play, aplikacja musi implementować funkcję wywołania zwrotnego NavigationManagerCallback.onAutoDriveEnabled
. Gdy wywołasz tę funkcję z poziomu funkcji zwracającej wywołanie zwrotne, aplikacja musi symulować nawigację do wybranego miejsca docelowego, gdy użytkownik rozpocznie nawigację. Aplikacja może wyjść z tego trybu, gdy cykl życia bieżącego procesu Session
osiągnie stan Lifecycle.Event.ON_DESTROY
.
Aby sprawdzić, czy Twoja implementacja funkcji onAutoDriveEnabled
jest wywoływana, wykonaj w wierszu poleceń następujące polecenie:
adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE
Przykład:
adb shell dumpsys activity service androidx.car.app.samples.navigation.car.NavigationCarAppService AUTO_DRIVE
Domyślna aplikacja do nawigacji w samochodzie
W Android Auto domyślna aplikacja nawigacyjna odpowiada ostatniej aplikacji nawigacyjnej uruchomionej przez użytkownika. Aplikacja domyślna otrzymuje intencje nawigacyjne, gdy użytkownik wywołuje polecenia nawigacji za pomocą Asystenta lub gdy inna aplikacja wysyła intencję rozpoczęcia nawigacji.
wyświetlać alerty nawigacyjne w kontekście;
Alert
wyświetla ważne informacje dla kierowcy z opcjonalnymi działaniami, bez konieczności opuszczania kontekstu ekranu nawigacji. Aby zapewnić kierowcy jak najlepsze wrażenia,
Alert
działa w ramach
NavigationTemplate
, aby nie blokować trasy nawigacji i zminimalizować rozproszenie uwagi kierowcy.
Funkcja Alert
jest dostępna tylko w ramach NavigationTemplate
.
Aby powiadomić użytkownika poza NavigationTemplate
, rozważ użycie powiadomienia o zbliżającym się wydarzeniu (HUN), zgodnie z opisem w artykule Wyświetlanie powiadomień.
Na przykład Alert
możesz użyć, aby:
- Poinformuj kierowcę o zmianie w bieżącej nawigacji, np. o zmianie warunków na drodze.
- Poproś kierowcę o aktualizację informacji dotyczących bieżącej nawigacji, na przykład o to, czy są fotoradary.
- Proponować nadchodzące zadanie i pytać, czy kierowca je zaakceptuje, np. czy jest gotowy odebrać kogoś po drodze.
W swojej podstawowej formie Alert
składa się z tytułu i czasu trwania Alert
. Czas trwania jest reprezentowany przez pasek postępu. Opcjonalnie możesz dodać napisy, ikonę i maksymalnie 2 elementy Action
.
Gdy wyświetli się Alert
, nie jest on przenoszony do innego szablonu, jeśli interakcja z użytkownikiem powoduje opuszczenie NavigationTemplate
.
Pozostają one w pierwotnym NavigationTemplate
do czasu, gdy Alert
wygaśnie, użytkownik podejmie działanie lub aplikacja zamknie Alert
.
Tworzenie alertu
Aby utworzyć instancję Alert
:Alert.Builder
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();
Jeśli chcesz słuchać Alert
anulowania lub odrzucenia, utwórz implementację interfejsu AlertCallback
.
Ścieżki wywołania AlertCallback
to:
Jeśli
Alert
przekroczy limit czasu, host wywołuje metodęAlertCallback.onCancel
z wartościąAlertCallback.REASON_TIMEOUT
. Następnie wywołuje metodęAlertCallback.onDismiss
.Jeśli kierowca kliknie jeden z przycisków działania, host wywoła funkcję
Action.OnClickListener
, a następnie funkcjęAlertCallback.onDismiss
.Jeśli
Alert
nie jest obsługiwana, host wywołuje funkcjęAlertCallback.onCancel
z wartościąAlertCallback.REASON_NOT_SUPPORTED
. Host nie dzwoni doAlertCallback.onDismiss
, ponieważAlert
nie został wyświetlony.
Konfigurowanie czasu trwania alertu
Wybierz czas trwania Alert
, który odpowiada potrzebom aplikacji. Zalecana długość nawigacjiAlert
to 10 sekund. Więcej informacji znajdziesz w artykule Ostrzeżenia nawigacyjne.
Pokaż alert
Aby wyświetlić Alert
, wywołaj metodę AppManager.showAlert
, która jest dostępna w aplikacji CarContext
.
// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
- Wywołanie funkcji
showAlert
z parametremAlert
, który ma identyfikatoralertId
, taki sam jak identyfikator wyświetlanego obecnie elementuAlert
, nie powoduje żadnego działania. WartośćAlert
się nie zmienia. Aby zaktualizowaćAlert
, musisz utworzyć go ponownie za pomocą nowegoalertId
. - Wywołanie
showAlert
zAlert
, które ma innąalertId
niżAlert
wyświetlaną obecnie, powoduje usunięcieAlert
wyświetlanego obecnie.
Zamknij alert
Chociaż Alert
jest automatycznie usuwane
z powodu limitu czasu lub interakcji kierowcy, możesz też ręcznie usunąć
Alert
, na przykład gdy informacje są nieaktualne. Aby zamknąć Alert
, wywołaj metodę dismissAlert
z parametrem alertId
Alert
.
// Dismiss the same alert
carContext.getCarService(AppManager.class).dismissAlert(alert.getId())
Wywołanie funkcji dismissAlert
z wartością alertId
, która nie odpowiada aktualnie wyświetlanej wartości Alert
, nie powoduje żadnych działań. Nie powoduje wyjątku.