Utwórz aplikację nawigacyjną

Na tej stronie opisujemy różne funkcje biblioteki aplikacji samochodowych, za pomocą których możesz zaimplementować funkcje aplikacji do nawigacji zakręt po zakręcie.

Zadeklaruj obsługę nawigacji w pliku manifestu

Aplikacja do nawigacji musi zadeklarować kategorię aplikacji samochodu androidx.car.app.category.NAVIGATION w filtrze intencji swojego obiektu 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ć w Twojej aplikacji intencje nawigacji, w tym te inicjowane przez Asystenta Google za pomocą zapytań głosowych, musi ona obsługiwać intencję CarContext.ACTION_NAVIGATE w Session.onCreateScreen i Session.onNewIntent.

Szczegółowe informacje o formacie intencji znajdziesz w dokumentacji dotyczącej obiektu CarContext.startCarApp.

Dostęp do szablonów nawigacji

Aplikacje do nawigacji mają dostęp do poniższych szablonów, które wyświetlają powierzchnię w tle z mapą, a podczas aktywnej nawigacji szczegółowe wskazówki dojazdu.

  • NavigationTemplate: wyświetla też podczas aktywnej nawigacji opcjonalny komunikat informacyjny i prognozę podróży.
  • MapWithContentTemplate: szablon, który umożliwia aplikacji renderowanie kafelków mapy z jakąś treścią (np. listą). Treści są zwykle renderowane w formie nakładki na fragmenty mapy, a miejsca na niej są widoczne, a stabilne obszary dostosowują się do zawartości.

Więcej informacji o projektowaniu interfejsu aplikacji do nawigacji za pomocą tych szablonów znajdziesz w artykule Aplikacje do nawigacji.

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>

Do rysowania map wymagane są dodatkowe uprawnienia.

Migracja do szablonu MapWithContentTemplate

Począwszy od poziomu 7 interfejsu Car App API poziomu 7, interfejsy MapTemplate, PlaceListNavigationTemplate i RoutePreviewNavigationTemplate zostały wycofane. Wycofane szablony będą nadal obsługiwane, ale zdecydowanie zalecamy ich migrację do MapWithContentTemplate.

Funkcje zawarte w tych szablonach można wdrożyć za pomocą MapWithContentTemplate. Przykłady znajdziesz w tych fragmentach kodu:

Szablon mapy

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();

Szablon nawigacji na liście miejsc

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();

Szablon nawigacji podglądu trasy

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();

Aplikacje do nawigacji muszą przekazać z hostem dodatkowe metadane nawigacji. Host wykorzystuje te informacje, aby przekazywać informacje do jednostki głównej pojazdu i zapobiegać konfliktowi między aplikacjami nawigacyjnymi o współdzielone zasoby.

Metadane nawigacyjne są dostarczane za pomocą usługi samochodowej NavigationManager 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 trasie i danymi klastra pojazdów, musi znać bieżący stan nawigacji. Gdy użytkownik rozpocznie nawigację, wywołaj NavigationManager.navigationStarted. I podobnie po zakończeniu nawigacji, np. gdy użytkownik dotrze do miejsca docelowego lub anuluje nawigację, wywołaj NavigationManager.navigationEnded.

Wywołuj funkcję NavigationManager.navigationEnded tylko po zakończeniu nawigacji przez użytkownika. Jeśli na przykład musisz ponownie obliczyć trasę w trakcie podróży, użyj właściwości Trip.Builder.setLoading(true).

Czasami host potrzebuje aplikacji, aby zatrzymać nawigację i wywołać onStopNavigation w obiekcie NavigationManagerCallback udostępnionym przez Twoją aplikację za pomocą NavigationManager.setNavigationManagerCallback. Następnie aplikacja musi przestać podawać informacje o następnym zakręcie na wyświetlaczu klastra oraz w powiadomieniach nawigacyjnych i wskazówkach głosowych.

Zaktualizuj informacje o podróży

Podczas aktywnej nawigacji zadzwoń pod numer NavigationManager.updateTrip. Informacji podanych w tej rozmowie można użyć w klastrze pojazdu i wyświetlaczach HUD. W zależności od konkretnego pojazdu użytkownik nie zobaczy wszystkich informacji. Na przykład pulpit główny (DHU) pokazuje obiekt Step dodany do Trip, ale nie pokazuje informacji o Destination.

Rysowanie do wyświetlania klastra

Aby zapewnić użytkownikom najlepsze wrażenia, możesz nie wyświetlać podstawowych metadanych na wyświetlaczu klastra pojazdu. Począwszy od interfejsu Car App API poziomu 6, aplikacje nawigacyjne mogą renderować własne treści bezpośrednio na wyświetlaczu klastra (w obsługiwanych pojazdach) z tymi ograniczeniami:

  • Interfejs API wyświetlania klastra nie obsługuje elementów sterujących danymi wejściowymi
  • Ekran klastra powinien pokazywać tylko fragmenty mapy. Opcjonalnie możesz wyświetlać na tych kafelkach aktywną nawigację po trasie.
  • Interfejs Cluster Display API obsługuje tylko te interfejsy: NavigationTemplate
    • W przeciwieństwie do ekranów głównych wyświetlacze klastrów mogą nie wyświetlać spójnie wszystkich elementów interfejsu NavigationTemplate, takich jak szczegółowe instrukcje, karty z szacowanym czasem dotarcia czy działania. Fragmenty mapy to jedyne spójnie wyświetlane elementy interfejsu.

Zadeklaruj obsługę klastra

Aby powiadomić aplikację hosta, że Twoja aplikacja obsługuje renderowanie na wyświetlaczach klastra, musisz dodać element androidx.car.app.category.FEATURE_CLUSTER <category> do pola <intent-filter> w CarAppService, jak 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 cyklem życia i stanem

Począwszy od poziomu interfejsu API 6, przebieg cyklu życia aplikacji samochodowej pozostaje bez zmian, ale CarAppService::onCreateSession korzysta teraz z parametru typu SessionInfo, który dostarcza dodatkowe informacje o tworzonym elemencie Session (czyli typ wyświetlania i zbiór obsługiwanych szablonów).

Aplikacje mogą używać tej samej klasy Session do obsługi klastra i ekranu głównego lub utworzyć specyficzne dla sieci reklamowej Sessions, aby dostosować działanie każdego wyświetlacza (jak pokazano w tym fragmencie).

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 ani czy zostanie udostępniony wyświetlacz klastra. Klaster Session może też być jedynym elementem Session (np. użytkownik przełączył główny wyświetlacz na inną aplikację podczas aktywnej nawigacji). Zgodnie z „standardową” umową aplikacja uzyskuje kontrolę nad wyświetlaczem klastra dopiero po wywołaniu funkcji NavigationManager::navigationStarted. Możliwe jest jednak, że aplikacja może mieć widok klastra, gdy nie jest aktywna nawigacja, lub nigdy nie udostępniać ekranu klastra. Od Twojej aplikacji zależy, czy radzisz sobie w tych sytuacjach, renderując stan bezczynności kafelków mapy.

Host tworzy osobne powiązanie i instancje CarContext na Session. Oznacza to, że gdy używasz metod takich jak ScreenManager::push czy Screen::invalidate, wpływa to tylko na metodę Session, z której są wywoływane. Aplikacje powinny tworzyć własne kanały komunikacji między tymi instancjami, jeśli potrzebna jest komunikacja międzySession (np. za pomocą transmisji, wspólnego singletonu lub czegoś innego).

Obsługa klastra testowania

Możesz przetestować implementację w systemie operacyjnym Android Auto i Android Automotive. W Androidzie Auto odbywa się to przez skonfigurowanie centrali komputerowej tak, aby emulowała dodatkowy wyświetlacz klastra. W systemie operacyjnym Android Automotive obrazy systemu ogólne dla interfejsu API na poziomie 30 lub wyższym emulują wyświetlacz klastra.

Dostosuj oszacowanie podróży za pomocą tekstu lub ikony

Aby dostosować oszacowanie dotyczące podróży za pomocą tekstu, ikony lub obu tych elementów, użyj metody klasy TravelEstimate.Builder setTripIcon lub setTripText. NavigationTemplate wykorzystuje TravelEstimate do opcjonalnie umieszczenia tekstu i ikon obok szacowanego czasu dotarcia, pozostałego czasu i odległości lub zamiast nich.

Rysunek 1. Prognoza dotycząca podróży z niestandardową ikoną i tekstem.

Ten fragment kodu używa znaczników setTripIcon i setTripText do dostosowania szacowanej długości:

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();

Otrzymuj powiadomienia zakręt po zakręcie

Udostępniaj szczegółowe instrukcje nawigacji w postaci często aktualizowanych powiadomień o nawigacji. Aby powiadomienie było traktowane jako powiadomienie o nawigacji na ekranie samochodu, kreator powiadomień musi:

  1. Za pomocą metody NotificationCompat.Builder.setOngoing oznacz powiadomienie jako trwające.
  2. Ustaw kategorię powiadomienia na Notification.CATEGORY_NAVIGATION.
  3. Rozwiń powiadomienie za pomocą CarAppExtender.

Powiadomienie nawigacji wyświetla się w widżecie kolei u dołu ekranu samochodu. Jeśli poziom ważności powiadomienia jest ustawiony na IMPORTANCE_HIGH, jest ono też wyświetlane jako powiadomienie HUD. Jeśli znaczenie nie zostało ustawione za pomocą metody CarAppExtender.Builder.setImportance, używane jest ważenie kanału powiadomień.

Aplikacja może ustawić PendingIntent w CarAppExtender, który jest wysyłany do aplikacji, gdy użytkownik kliknie widżet HUN lub Rail.

Jeśli funkcja NotificationCompat.Builder.setOnlyAlertOnce zostanie wywołana z wartością true, powiadomienie o dużej ważności wyświetli się tylko raz w HUN.

Z tego fragmentu kodu dowiesz się, 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 w przypadku zmiany odległości, co spowoduje zaktualizowanie widżetu pociągów i wyświetli tylko powiadomienie HUN. Działaniem HUN możesz kontrolować, ustawiając ważność powiadomienia za pomocą CarAppExtender.Builder.setImportance. Ustawienie ważności na IMPORTANCE_HIGH pokazuje wartość HUN. Ustawienie dowolnej innej wartości powoduje tylko zaktualizowanie widżetu rail.

Odświeżenie zawartości szablonu PlaceListNavigationTemplate

Możesz umożliwić kierowcom odświeżanie treści jednym kliknięciem podczas przeglądania list miejsc utworzonych przy użyciu PlaceListNavigationTemplate. Aby włączyć odświeżanie listy, zaimplementuj metodę onContentRefreshRequested interfejsu OnContentRefreshListener i użyj PlaceListNavigationTemplate.Builder.setOnContentRefreshListener do ustawienia detektora w szablonie.

Ten fragment kodu pokazuje, jak ustawić detektor 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 obiektu PlaceListNavigationTemplate tylko wtedy, gdy detektor ma jakąś wartość.

Gdy użytkownik kliknie przycisk odświeżania, wywoływana jest metoda onContentRefreshRequested z Twojej implementacji OnContentRefreshListener. W obiekcie onContentRefreshRequested wywołaj metodę Screen.invalidate. Następnie host ponownie wywołuje metodę Screen.onGetTemplate aplikacji, aby pobrać szablon z odświeżoną treścią. Więcej informacji o odświeżaniu szablonów znajdziesz w artykule Odświeżanie zawartości szablonu. Jeśli następny szablon zwracany przez metodę onGetTemplate jest tego samego typu, jest to liczone jako odświeżenie i nie wliczają się do limitu szablonu.

Włącz wskazówki audio

Aby odtwarzać wskazówki nawigacyjne na głośnikach samochodu, aplikacja musi poprosić o fokus audio. W ramach AudioFocusRequest ustaw wykorzystanie na AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE. Ustaw wzmocnienie ostrości na AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.

Symulowanie nawigacji

Aby po przesłaniu aplikacji do Sklepu Google Play zweryfikować funkcje nawigacji, musi ona obsługiwać wywołanie zwrotne NavigationManagerCallback.onAutoDriveEnabled. Po wywołaniu tego wywołania zwrotnego 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 Session osiągnie stan Lifecycle.Event.ON_DESTROY.

Aby sprawdzić, czy implementacja onAutoDriveEnabled jest wywoływana, wykonaj to polecenie z wiersza poleceń:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

Widać to w tym przykładzie:

adb shell dumpsys activity service androidx.car.app.samples.navigation.car.NavigationCarAppService AUTO_DRIVE

Domyślna aplikacja do nawigacji w samochodzie

W Androidzie Auto domyślna aplikacja do nawigacji samochodowej odpowiada ostatniej aplikacji do nawigacji uruchomionej przez użytkownika. Aplikacja domyślna otrzymuje intencje nawigacji, gdy użytkownik wywołuje polecenia nawigacyjne za pomocą Asystenta lub gdy inna aplikacja wysyła zamiar rozpoczęcia nawigacji.

Wyświetlaj alerty nawigacji w kontekście

Alert wyświetla kierowcy ważne informacje wraz z opcjonalnymi działaniami bez opuszczania kontekstu ekranu nawigacyjnego. Aby zapewnić kierowcy najlepsze wrażenia, Alert działa w obszarze NavigationTemplate, aby nie blokować trasy nawigacji i ograniczać rozpraszanie uwagi kierowcy.

Usługa Alert jest dostępna tylko w domenie NavigationTemplate. Aby powiadomić użytkownika poza obszarem NavigationTemplate, rozważ użycie powiadomienia HUD, jak opisano w sekcji Wyświetlanie powiadomień.

Alert pozwala na przykład:

  • Poinformuj kierowcę o aktualizacji zgodnej z bieżącą funkcją nawigacji, np. o zmianie warunków na drodze.
  • Poproś kierowcę o aktualizację informacji związanych z bieżącą nawigację, np. o funkcję kontroli prędkości.
  • Zaproponuj najbliższe zadanie i zapytaj kierowcę, czy je akceptuje – na przykład czy kierowca chce odebrać kogoś po drodze.

W podstawowej postaci pole Alert składa się z tytułu i czasu trwania w polu Alert. Jest on przedstawiony na pasku postępu. Opcjonalnie możesz dodać podtytuł, ikonę i maksymalnie 2 obiekty Action.

Rysunek 2. Alert nawigacji w kontekście.

Po wyświetleniu obiektu Alert nie jest on przenoszony do innego szablonu, jeśli interakcja kierowcy powoduje opuszczenie NavigationTemplate. Pozostają one w pierwotnym NavigationTemplate do upłynięcia czasu oczekiwania Alert, użytkownik wykona działanie lub aplikacja zamknie Alert.

Utwórz alert

Użyj narzędzia Alert.Builder, aby utworzyć instancję Alert:

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 nasłuchiwać anulowania lub odrzucenia Alert, utwórz implementację interfejsu AlertCallback. Ścieżki wywołania AlertCallback:

Skonfiguruj czas trwania alertu

Wybierz czas trwania Alert odpowiedni do potrzeb Twojej aplikacji. Zalecany czas trwania nawigacji Alert to 10 sekund. Więcej informacji znajdziesz w artykule Alerty nawigacyjne.

Pokaż alert

Aby wyświetlić Alert, wywołaj metodę AppManager.showAlert dostępną w CarContext Twojej aplikacji.

// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
  • Nie można wywołać metody showAlert za pomocą Alert, który ma alertId taki sam jak identyfikator aktualnie wyświetlanego obiektu Alert. Alert się nie aktualizuje. Aby zaktualizować obiekt Alert, musisz utworzyć go ponownie z nowym elementem alertId.
  • Wywołanie showAlert z użyciem Alert, które ma inny identyfikator alertId niż wyświetlany obecnie Alert, spowoduje zamknięcie wyświetlonego Alert.

Odrzucanie alertu

Chociaż Alert automatycznie zamyka się z powodu przekroczenia limitu czasu lub interakcji z kierowcą, możesz też zamknąć Alert ręcznie, na przykład gdy informacje o nim staną się nieaktualne. Aby odrzucić metodę Alert, wywołaj metodę dismissAlert za pomocą alertId właściwości Alert.

// Dismiss the same alert
carContext.getCarService(AppManager.class).dismissAlert(alert.getId())

Wywołanie dismissAlert z wartością alertId, która nie pasuje do obecnie wyświetlanego Alert, nie działa. Nie spowoduje to zgłoszenia wyjątku.