Utwórz aplikację nawigacyjną

Na tej stronie szczegółowo opisujemy różne funkcje biblioteki aplikacji samochodowej, których możesz użyć do zaimplementowania funkcji aplikacji do nawigacji zakręt po zakręcie.

Zadeklaruj obsługę nawigacji w pliku manifestu

Aplikacja do nawigacji musi zadeklarować kategorię aplikacji samochodowej androidx.car.app.category.NAVIGATION w filtrze intencji w elemencie 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 związanych z nawigacją

Aby obsługiwać intencje związane z nawigacją do aplikacji, w tym te pochodzące od Asystenta Google za pomocą zapytania głosowego, aplikacja musi obsługiwać intencje CarContext.ACTION_NAVIGATE w treściach Session.onCreateScreen i Session.onNewIntent.

Szczegółowe informacje o formacie intencji znajdziesz w dokumentacji CarContext.startCarApp.

Uzyskiwanie dostępu do szablonów nawigacji

Aplikacje nawigacyjne mają dostęp do tych szablonów przeznaczonych specjalnie do nawigacji w aplikacjach. Wszystkie te szablony wyświetlają w tle płaszczyznę z mapą oraz szczegółowe wskazówki dojazdu podczas aktywnej nawigacji.

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 swoim pliku AndroidManifest.xml:

<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>

Rysowanie mapy

Aplikacje nawigacyjne mogą korzystać z Surface, aby rysować mapę na odpowiednich szablonach.

Aby uzyskać dostęp do obiektu SurfaceContainer, ustaw instancję SurfaceCallback w usłudze samochodowej AppManager:

Kotlin

carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)

Java

carContext.getCarService(AppManager.class).setSurfaceCallback(surfaceCallback);

SurfaceCallback udostępnia wywołanie zwrotne, gdy SurfaceContainer jest dostępny, wraz z innymi wywołaniami zwrotnymi, gdy zmienią się właściwości Surface.

Aby uzyskać dostęp do platformy, aplikacja musi zadeklarować uprawnienie androidx.car.app.ACCESS_SURFACE w swoim pliku AndroidManifest.xml:

<uses-permission android:name="androidx.car.app.ACCESS_SURFACE"/>

Widoczny obszar mapy

Host może rysować na mapie elementy interfejsu użytkownika szablonów. Host komunikuje obszar, który jest niezasłonięty i w pełni widoczny dla użytkownika, wywołując metodę SurfaceCallback.onVisibleAreaChanged. Aby zminimalizować liczbę zmian, host wywołuje metodę SurfaceCallback.onStableAreaChanged z najmniejszym prostokątem, który jest zawsze widoczny w zależności od bieżącego szablonu.

Jeśli na przykład aplikacja do nawigacji używa elementu NavigationTemplate z paskiem działań u góry, pasek działań może się ukryć, gdy użytkownik przez pewien czas nie wchodzi w interakcję z ekranem, aby zwolnić miejsce na mapę. W takim przypadku istnieje wywołanie zwrotne do onStableAreaChanged i onVisibleAreaChanged z tym samym prostokątem. Gdy pasek działań jest ukryty, wywoływane jest tylko wywołanie onVisibleAreaChanged z większym obszarem. Jeśli użytkownik wejdzie w interakcję z ekranem, z pierwszym prostokątem zostanie wywołany tylko onVisibleAreaChanged.

Obsługa trybu ciemnego

Aplikacje nawigacyjne muszą ponownie zarysować w instancji Surface swoją mapę z odpowiednimi ciemnymi kolorami, gdy gospodarz określi odpowiednie warunki, zgodnie z opisem w sekcji Jakość aplikacji na Androida w samochodach.

Aby zdecydować, czy chcesz narysować ciemną mapę, możesz użyć metody CarContext.isDarkMode. Po każdej zmianie stanu trybu ciemnego otrzymasz połączenie na numer Session.onCarConfigurationChanged.

Aplikacje nawigacyjne muszą przekazywać dodatkowe metadane nawigacji z hostem. Gospodarz wykorzystuje te informacje do dostarczania informacji do radioodtwarzacza pojazdu i zapobiegania konfliktowi z aplikacjami nawigacyjnymi o udostępnione zasoby.

Metadane nawigacji są dostarczane przez usługę samochodową NavigationManager dostępną 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 nawigacyjnymi, powiadomieniami o trasach i danymi klastra pojazdów, musi uwzględniać bieżący stan nawigacji. Gdy użytkownik rozpocznie nawigację, wywołaj NavigationManager.navigationStarted. Analogicznie, gdy zakończy się nawigacja, na przykład gdy użytkownik dotrze do miejsca docelowego lub anuluje nawigację, wywołaj NavigationManager.navigationEnded.

Wywołuj NavigationManager.navigationEnded dopiero wtedy, gdy użytkownik zakończy nawigację. Jeśli na przykład chcesz ponownie obliczyć trasę w trakcie podróży, użyj opcji Trip.Builder.setLoading(true).

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

Zaktualizuj informacje o podróży

Podczas aktywnej nawigacji wywołaj NavigationManager.updateTrip. Informacje podane w tej rozmowie mogą być używane przez klaster pojazdu i wyświetlacze HUD. W zależności od używanego pojazdu nie wszystkie informacje są wyświetlane użytkownikowi. Na przykład na komputerze PC (DHU) wyświetla się element Step dodany do elementu Trip, ale nie informacje o Destination.

Rysowanie na wyświetlaczu klastra

Aby zapewnić jak najlepsze wrażenia użytkownikom, możesz wykraczać poza wyświetlanie podstawowych metadanych na wyświetlaczu klastra pojazdu. Począwszy od poziomu 6 Car App API, aplikacje nawigacyjne mogą renderować własne treści bezpośrednio na wyświetlaczu klastra (w obsługiwanych pojazdach), ale obowiązują te ograniczenia:

  • Interfejs API wyświetlania klastra nie obsługuje elementów sterujących do wprowadzania danych
  • Na wyświetlaczu klastra powinny być widoczne tylko fragmenty mapy. Na tych kafelkach może być opcjonalnie wyświetlana aktywna nawigacja po trasie.
  • Interfejs API wyświetlania klastra obsługuje tylko interfejs NavigationTemplate
    • W przeciwieństwie do ekranów głównych, na wyświetlaczach klastra mogą nie wyświetlać się wszystkie elementy interfejsu NavigationTemplate, takie jak szczegółowe instrukcje, karty z szacowanym czasem dotarcia czy działania. Jedynym elementem UI wyświetlanym w sposób spójny są elementy mapy.

Deklarowanie obsługi klastra

Aby poinformować aplikację hostującą, że Twoja aplikacja obsługuje renderowanie na wyświetlaczach klastrów, musisz dodać element androidx.car.app.category.FEATURE_CLUSTER <category> do parametru <intent-filter> CarAppService, jak pokazano w tym fragmencie:

<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 API 6 przepływ cyklu życia aplikacji do samochodu nie zmienia się, ale parametr CarAppService::onCreateSession przyjmuje teraz parametr typu SessionInfo, który dostarcza dodatkowe informacje o tworzonym elemencie Session (czyli typ wyświetlania i zestaw obsługiwanych szablonów).

Aplikacje mogą używać tej samej klasy Session do obsługi klastra i ekranu głównego albo utworzyć Sessions dla określonego wyświetlacza, aby dostosować działanie na każdym wyświetlaczu (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 i czy pojawi się wyświetlacz klastra. Klaster Session może też być jedynym Session (np. użytkownik zamienił główny ekran na inną aplikację, gdy Twoja aplikacja aktywnie się nawiguje). Umowa „standardowa” oznacza, że aplikacja przejmuje kontrolę nad wyświetlaniem klastra dopiero po wywołaniu funkcji NavigationManager::navigationStarted. Aplikacja może jednak być wyświetlana w klastrze, gdy nie trwa żadna aktywna nawigacja, lub nigdy nie udostępniać tego widoku. Od Twojej aplikacji zależy radzenie sobie w tych scenariuszach przez renderowanie jej nieaktywnych elementów mapy.

Host tworzy oddzielne powiązanie i CarContext instancje na Session. Oznacza to, że w przypadku metod takich jak ScreenManager::push lub Screen::invalidate wpływa tylko na element Session, z którego są wywoływane. Jeśli potrzebna jest komunikacja między Session, aplikacje powinny utworzyć własne kanały komunikacji (np. przy użyciu transmisji, udostępnionego singletonu lub innej funkcji).

Obsługa klastra testowania

Wdrożoną implementację możesz przetestować zarówno na Androidzie Auto, jak i na Androidzie Automotive. W przypadku Androida Auto można to zrobić, konfigurując komputerową jednostkę główną tak, aby emulowała wyświetlacz dodatkowego klastra. W przypadku systemu operacyjnego Android Automotive ogólne obrazy systemu dla interfejsu API poziomu 30 lub nowszego emulują wyświetlanie klastra.

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

Aby dostosować oszacowanie podróży za pomocą tekstu, ikony lub obu tych elementów, użyj metod klasy setTripIcon lub setTripText klasy TravelEstimate.Builder. NavigationTemplate korzysta z TravelEstimate, aby opcjonalnie ustawić tekst i ikony obok szacowanego czasu przyjazdu, pozostałego czasu i pozostałej odległości.

Rysunek 1. Szacunkowy koszt podróży z własną ikoną i tekstem.

Ten fragment kodu używa atrybutów setTripIcon i setTripText, aby dostosować oszacowanie podróży:

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ępnij instrukcje nawigacji zakręt po zakręcie, używając często aktualizowanego powiadomień nawigacyjnych. Aby powiadomienie było wyświetlane na ekranie samochodu, kreator powiadomień musi wykonać te czynności:

  1. Oznacz powiadomienie jako trwające za pomocą metody NotificationCompat.Builder.setOngoing.
  2. Ustaw kategorię powiadomienia na Notification.CATEGORY_NAVIGATION.
  3. Rozszerz powiadomienie za pomocą elementu CarAppExtender.

W widżecie linii kolejowej u dołu ekranu samochodu pojawi się powiadomienie o nawigacji. Jeśli poziom ważności powiadomienia jest ustawiony na IMPORTANCE_HIGH, wyświetla się też jako powiadomienie z wyprzedzeniem (HUN). Jeśli ważność nie jest określona za pomocą metody CarAppExtender.Builder.setImportance, używana jest waga kanału powiadomienia.

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

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

Ten fragment kodu pokazuje, jak utworzyć powiadomienie o nawigacji:

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 o zmianach odległości, które aktualizuje widżet pociągów i wyświetla je tylko jako HUN. Działanie GUN możesz kontrolować, ustawiając znaczenie powiadomienia w CarAppExtender.Builder.setImportance. Ustawienie ważności na IMPORTANCE_HIGH powoduje uruchomienie polecenia HUN. Ustawienie jej na dowolną inną wartość powoduje tylko zaktualizowanie widżetu „kolejka”.

Odśwież zawartość elementu PlaceList NavigationTemplate

Możesz zezwolić kierowcom na 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ć 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 pojawia się w nagłówku elementu PlaceListNavigationTemplate tylko wtedy, gdy detektor ma określoną wartość.

Gdy użytkownik kliknie przycisk odświeżania, wywoływana jest metoda onContentRefreshRequested w Twojej implementacji OnContentRefreshListener. W onContentRefreshRequested wywołaj metodę Screen.invalidate. Host ten 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 sekcji Odświeżanie zawartości szablonu. O ile następny szablon zwracany przez onGetTemplate jest tego samego typu, liczy się to jako odświeżenie i nie wliczają się do limitu szablonu.

Wskazówki audio

Aby odtwarzać wskazówki nawigacyjne przez głośniki samochodu, aplikacja musi poprosić o zaznaczenie dźwięku. W ramach AudioFocusRequest ustaw użycie na AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE. Dodatkowo ustaw wzmocnienie ostrości na AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.

Symulowanie nawigacji

Aby można było zweryfikować funkcje nawigacji w aplikacji po przesłaniu jej do Sklepu Google Play, 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 elementu Session osiągnie stan Lifecycle.Event.ON_DESTROY.

Aby sprawdzić, czy implementacja onAutoDriveEnabled jest wywoływana, wykonaj to polecenie w wierszu 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 Androidzie Auto domyślna aplikacja do nawigacji odpowiada ostatniej aplikacji nawigacyjnej uruchomionej przez użytkownika. Domyślna aplikacja odbiera intencje nawigacyjne, gdy użytkownik wywołuje polecenia nawigacyjne za pomocą Asystenta lub gdy inna aplikacja wysyła zamiar rozpoczęcia nawigacji.

Zezwalanie użytkownikom na interakcję z mapą

Możesz dodać obsługę przez użytkowników w zakresie korzystania z map, na przykład przez przybliżanie i przesuwanie jej różnych części. Każdy szablon ma inne wymaganie minimalne na poziomie interfejsu Car App API. W tabeli poniżej znajdziesz minimalny poziom szablonu, który chcesz zaimplementować.

SzablonObsługa interaktywności od poziomu interfejsu Car App API
NavigationTemplate2
PlaceListNavigationTemplate4
RoutePreviewNavigationTemplate4
MapTemplate 5

Metody wywołania zwrotnego platformy

Interfejs SurfaceCallback udostępnia kilka metod wywołania zwrotnego, które pozwalają zwiększyć interaktywność map utworzonych za pomocą szablonów NavigationTemplate, PlaceListNavigationTemplate, RoutePreviewNavigationTemplate lub MapTemplate: onClick, onScroll, onScale i onFling. W tabeli poniżej znajdziesz informacje o tym, jak te wywołania zwrotne są powiązane z interakcjami użytkowników.

Interakcja SurfaceCallback metoda Obsługiwany od poziomu interfejsu Car App API
Dotknięcie onClick 5
Zmiana powiększania ekranu przez rozsunięcie lub ściągnięcie palców onScale 2
Przeciąganie jednym kliknięciem onScroll 2
Rzut po 1 dotknięciu onFling 2
Kliknij dwukrotnie onScale (ze współczynnikiem skali określonym przez hosta szablonu) 2
Przesunięcie obrotowe w trybie przesuwania onScroll (ze współczynnikiem odległości określonym przez hosta szablonu) 2

Pasek działań na mapie

Szablony NavigationTemplate, PlaceListNavigationTemplate, RoutePreviewNavigationTemplate i MapTemplate mogą mieć pasek działań na mapie, który umożliwia takie działania jak powiększanie i pomniejszanie, wyśrodkowanie, wyświetlanie kompasu i inne działania, które chcesz wyświetlać. Pasek działań na mapie może zawierać maksymalnie 4 przyciski z samymi ikonami, które można odświeżać bez wpływu na głębię zadania. Ukrywa się w stanie bezczynności i pojawia się ponownie w stanie aktywnym.

Aby otrzymywać wywołania zwrotne interaktywności mapy, musisz dodać przycisk Action.PAN do paska działań mapy. Gdy użytkownik naciśnie przycisk przesuwania, host przejdzie w tryb przesuwania, jak opisano w następnej sekcji.

Jeśli Twoja aplikacja pominie przycisk Action.PAN na pasku działań mapy, nie otrzyma danych wejściowych użytkownika z metod SurfaceCallback, a host zamknie każdy wcześniej aktywowany tryb przesuwania.

Na ekranie dotykowym przycisk przesuwania się nie wyświetla.

Tryb przesuwania

W trybie przesuwania host szablonu przekształca dane wejściowe użytkownika z niedotykowych urządzeń wejściowych, takich jak kontrolery obrotowe i touchpady, na odpowiednie metody SurfaceCallback. Reaguj na działanie użytkownika, aby włączyć lub wyłączyć tryb przesuwania za pomocą metody setPanModeListener w NavigationTemplate.Builder. Gdy użytkownik jest w trybie przesuwania, host może ukrywać w szablonie inne komponenty UI.

Obszar stabilny

Obszar stabilny jest aktualizowany między stanem nieaktywnym a aktywnym. Zdecyduj, czy chcesz narysować informacje związane z jazdą (np. prędkość, ograniczenie prędkości lub ostrzeżenia drogowe) na podstawie wielkości nieruchomego obszaru, tak aby ważne informacje na mapie nie zasłaniały obszaru działań.

Wyświetl kontekstowe alerty nawigacji

Alert wyświetla ważne informacje kierowcy z opcjonalnymi działaniami i myślnikiem bez opuszczania ekranu nawigacyjnego. Aby zapewnić kierowcom jak najlepsze wrażenia, Alert zapobiega blokowaniu trasy i ogranicza rozpraszanie kierowcy przez NavigationTemplate.

Usługa Alert jest dostępna tylko w: NavigationTemplate. Aby powiadamiać użytkownika spoza interfejsu NavigationTemplate, rozważ użycie powiadomienia Ostrzeżenie (HUN), zgodnie z opisem w sekcji Wyświetlanie powiadomień.

Dzięki Alert możesz na przykład:

  • Poinformuj kierowcę o aktualnościach związanych z bieżącą trasą, np. o zmianie warunków na drodze.
  • Poproś kierowcę o aktualne informacje dotyczące nawigacji, np. o systemie kontroli prędkości.
  • Zaproponuj nadchodzące zadanie i zapytaj, czy kierowca je akceptuje, np. czy może odebrać kogoś po drodze.

W podstawowej postaci Alert składa się z tytułu i czasu trwania Alert. Czas trwania jest przedstawiony w postaci paska postępu. Opcjonalnie możesz dodać podtytuł, ikonę i maksymalnie 2 obiekty Action.

Rysunek 2. Alert nawigacji w kontekście.

Po wyświetleniu elementu Alert nie zostanie on przeniesiony do innego szablonu, jeśli interakcja z kierowcą spowoduje opuszczenie interfejsu NavigationTemplate. Pozostaje w pierwotnym stanie NavigationTemplate, dopóki Alert nie minie, użytkownik podejmie działanie lub aplikacja zamknie Alert.

Utwórz alert

Użyj 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 czekać na anulowanie lub odrzucenie Alert, utwórz implementację interfejsu AlertCallback. Ścieżki połączeń AlertCallback:

Skonfiguruj czas trwania alertu

Wybierz czas trwania Alert pasujący do potrzeb aplikacji. Zalecany czas trwania nawigacji Alert to 10 sekund. Więcej informacji znajdziesz w artykule Alerty nawigacji.

Pokaż alert

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

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

Odrzucanie alertu

Alert jest zamykany automatycznie z powodu przekroczenia limitu czasu oczekiwania lub interakcji kierowcy, ale możesz też ręcznie zamknąć Alert, na przykład jeśli jego informacje staną się nieaktualne. Aby odrzucić metodę Alert, wywołaj metodę dismissAlert z alertId: Alert.

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

Wywołanie metody dismissAlert z numerem alertId, które nie jest zgodne z aktualnie wyświetlanym Alert, nie przynosi efektu. Nie robi wyjątku.