Crea un'app di navigazione

In questa pagina vengono descritte le diverse funzionalità della libreria di app per auto che puoi utilizzare per implementare la funzionalità dell'app di navigazione passo passo.

Dichiara il supporto della navigazione nel file manifest

La tua app di navigazione deve dichiarare la androidx.car.app.category.NAVIGATION categoria di app auto nel filtro per intent del suo 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>

Supporta gli intent di navigazione

Per supportare gli intent di navigazione nella tua app, inclusi quelli provenienti dall'Assistente Google utilizzando una query vocale, l'app deve gestire l'intent CarContext.ACTION_NAVIGATE nei suoi Session.onCreateScreen e Session.onNewIntent.

Per i dettagli sul formato dell'intent, consulta la documentazione relativa a CarContext.startCarApp.

Accedere ai modelli di navigazione

Le app di navigazione possono accedere ai seguenti modelli progettati appositamente per le app di navigazione. Tutti questi modelli mostrano una superficie sullo sfondo con la mappa e, durante la navigazione attiva, le indicazioni passo passo.

  • NavigationTemplate: mostra anche un messaggio informativo facoltativo e stime di viaggio durante la navigazione attiva.
  • MapTemplate: presenta una versione compatta di un elenco (come ListTemplate) o di un riquadro (informazioni dettagliate con azioni in evidenza, come PaneTemplate) accanto a una mappa.
  • PlaceListNavigationTemplate: mostra anche un elenco di luoghi, per i quali possono essere stati tracciati indicatori corrispondenti sulla mappa.
  • RoutePreviewNavigationTemplate: mostra anche un elenco di route, una delle quali può essere selezionata ed evidenziata nella mappa.

Per ulteriori informazioni su come progettare l'interfaccia utente dell'app di navigazione utilizzando questi modelli, consulta App di navigazione.

Per ottenere l'accesso ai modelli di navigazione, la tua app deve dichiarare l'autorizzazione androidx.car.app.NAVIGATION_TEMPLATES nel file AndroidManifest.xml:

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

Traccia la mappa

Le app di navigazione possono accedere a una Surface per disegnare la mappa su modelli pertinenti.

A un oggetto SurfaceContainer è quindi possibile accedere impostando un'istanza SurfaceCallback sul servizio auto AppManager:

Kotlin

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

Java

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

SurfaceCallback fornisce un callback quando SurfaceContainer è disponibile, insieme ad altri callback quando le proprietà di Surface cambiano.

Per ottenere l'accesso alla piattaforma, la tua app deve dichiarare l'autorizzazione androidx.car.app.ACCESS_SURFACE nel file AndroidManifest.xml:

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

L'area visibile della mappa

L'host può disegnare gli elementi dell'interfaccia utente per i modelli nella parte superiore della mappa. L'host comunica l'area che è garantita essere libera e completamente visibile all'utente chiamando il metodo SurfaceCallback.onVisibleAreaChanged. Inoltre, per ridurre al minimo il numero di modifiche, l'host chiama il metodo SurfaceCallback.onStableAreaChanged con il rettangolo più piccolo, che è sempre visibile in base al modello corrente.

Ad esempio, quando un'app di navigazione utilizza NavigationTemplate con una barra delle azioni in alto, questa può nascondersi quando l'utente non ha interagito con lo schermo per un po' di tempo per liberare spazio per la mappa. In questo caso, è presente un callback per onStableAreaChanged e onVisibleAreaChanged con lo stesso rettangolo. Quando la barra delle azioni è nascosta, viene richiamata solo onVisibleAreaChanged con l'area più grande. Se l'utente interagisce con lo schermo, viene chiamata di nuovo solo onVisibleAreaChanged con il primo rettangolo.

Supporta la modalità Buio

Le app di navigazione devono ritracciare la mappa sull'istanza Surface con i colori scuri appropriati quando l'host stabilisce che le condizioni lo giustificano, come descritto in Qualità delle app Android per le auto.

Per decidere se tracciare una mappa scura, puoi usare il metodo CarContext.isDarkMode. Ogni volta che lo stato della modalità Buio cambia, ricevi una chiamata al numero Session.onCarConfigurationChanged.

Le app di navigazione devono comunicare all'host ulteriori metadati di navigazione. L'host utilizza le informazioni per fornire informazioni all'unità principale del veicolo e per impedire il conflitto tra le applicazioni di navigazione e le risorse condivise.

I metadati di navigazione sono forniti tramite il servizio auto NavigationManager accessibile da CarContext:

Kotlin

val navigationManager = carContext.getCarService(NavigationManager::class.java)

Java

NavigationManager navigationManager = carContext.getCarService(NavigationManager.class);

Avviare, terminare e interrompere la navigazione

Affinché l'host possa gestire più app di navigazione, notifiche di routing e dati sui cluster dei veicoli, deve conoscere lo stato attuale della navigazione. Quando un utente avvia la navigazione, chiama NavigationManager.navigationStarted. Analogamente, quando la navigazione termina, ad esempio quando l'utente arriva a destinazione o annulla la navigazione, chiama NavigationManager.navigationEnded.

Chiama NavigationManager.navigationEnded solo quando l'utente termina la navigazione. Ad esempio, se devi ricalcolare il percorso a metà di una corsa, utilizza invece Trip.Builder.setLoading(true).

A volte l'host ha bisogno di un'app per interrompere la navigazione e chiamare onStopNavigation in un oggetto NavigationManagerCallback fornito dalla tua app tramite NavigationManager.setNavigationManagerCallback. L'app deve quindi interrompere l'invio di informazioni relative alla prossima svolta nel display del cluster, nelle notifiche di navigazione e nella guida vocale.

Aggiornare le informazioni sulla corsa

Durante la navigazione attiva, chiama NavigationManager.updateTrip. Le informazioni fornite in questa chiamata possono essere utilizzate dal cluster e dai display di avviso del veicolo. A seconda del veicolo usato, non tutte le informazioni vengono mostrate all'utente. Ad esempio, l'unità principale desktop (DHU) mostra la Step aggiunta a Trip, ma non le informazioni di Destination.

Disegno sulla visualizzazione del cluster

Per offrire un'esperienza utente più immersiva, ti consigliamo di andare oltre la visualizzazione dei metadati di base sul display del cluster del veicolo. A partire dal livello 6 dell'API Car App, le app di navigazione hanno la possibilità di visualizzare i propri contenuti direttamente sul display del cluster (nei veicoli supportati), con le seguenti limitazioni:

  • L'API di visualizzazione cluster non supporta i controlli di input
  • Il display del cluster deve mostrare solo i riquadri della mappa. Su questi riquadri può essere facoltativamente visualizzata una navigazione attiva del percorso.
  • L'API di visualizzazione cluster supporta solo l'utilizzo di NavigationTemplate
    • A differenza dei display principali, i display dei cluster potrebbero non mostrare in modo coerente tutti gli elementi dell'interfaccia utente NavigationTemplate, ad esempio istruzioni passo passo, schede ETA e azioni. I riquadri della mappa sono l'unico elemento UI mostrato in modo coerente.

Dichiara il supporto per il cluster

Per comunicare all'applicazione host che la tua app supporta il rendering sui display dei cluster, devi aggiungere un elemento androidx.car.app.category.FEATURE_CLUSTER <category> a <intent-filter> di CarAppService come mostrato nel seguente snippet:

<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>

Gestione del ciclo di vita e dello stato

A partire dal livello API 6, il flusso del ciclo di vita dell'app per auto rimane invariato, ma ora CarAppService::onCreateSession utilizza un parametro di tipo SessionInfo che fornisce informazioni aggiuntive sulla creazione Session (ovvero, il tipo di display e il set di modelli supportati).

Le app possono scegliere di utilizzare la stessa classe Session per gestire sia il cluster che il display principale oppure creare Sessions specifiche per la Rete Display per personalizzare il comportamento su ciascun display (come mostrato nello snippet seguente).

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

Non ci sono garanzie su quando o se verrà fornito il display del cluster ed è anche possibile che il cluster Session sia l'unico Session (ad esempio, l'utente ha scambiato il display principale con un'altra app mentre la tua app sta navigando attivamente). Il contratto "standard" prevede che l'app acquisisca il controllo della visualizzazione del cluster solo dopo la chiamata a NavigationManager::navigationStarted. Tuttavia, è possibile che all'app venga fornita la visualizzazione del cluster quando non è in corso alcuna navigazione attiva o che non venga mai fornita la visualizzazione del cluster. Spetta alla tua app gestire questi scenari eseguendo il rendering dello stato di inattività dell'app dei riquadri della mappa.

L'host crea un binder separato e CarContext istanze per Session. Ciò significa che, quando utilizzi metodi come ScreenManager::push o Screen::invalidate, solo il Session da cui vengono chiamati è interessato. Le app devono creare i propri canali di comunicazione tra queste istanze se è necessaria una comunicazione tra Session (ad esempio, utilizzando le trasmissioni, un single condiviso o altro).

Test dei cluster di supporto

Puoi testare l'implementazione sia sul sistema operativo Android Auto sia sul sistema operativo Android Automotive. Per Android Auto, puoi farlo configurando l'unità principale desktop in modo da emulare il display di un cluster secondario. Per il sistema operativo Android Automotive, le immagini di sistema generiche per il livello API 30 e successivi emulano la visualizzazione di un cluster.

Personalizza TravelStima con testo o un'icona

Per personalizzare la stima del viaggio con testo, un'icona o entrambi, utilizza i metodi setTripIcon o setTripText della classe TravelEstimate.Builder. L'NavigationTemplate utilizza TravelEstimate per impostare facoltativamente testo e icone accanto o al posto dell'ora di arrivo prevista, del tempo rimanente e della distanza rimanente.

Figura 1. Stima di viaggio con icona e testo personalizzati.

Lo snippet seguente utilizza setTripIcon e setTripText per personalizzare la stima del viaggio:

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

Fornire notifiche passo passo

Fornire istruzioni di navigazione passo passo (TBT) utilizzando una notifica di navigazione aggiornata di frequente. Per essere considerata come una notifica di navigazione sullo schermo dell'auto, il generatore di notifiche deve:

  1. Contrassegna la notifica come continua con il metodo NotificationCompat.Builder.setOngoing.
  2. Imposta la categoria della notifica su Notification.CATEGORY_NAVIGATION.
  3. Estendi la notifica con un CarAppExtender.

Nel widget Ferroviario in fondo allo schermo dell'auto viene visualizzata una notifica di navigazione. Se il livello di importanza della notifica è impostato su IMPORTANCE_HIGH, viene visualizzata anche come notifica di avviso (HUN). Se l'importanza non è impostata con il metodo CarAppExtender.Builder.setImportance, viene utilizzata l'importanza del canale di notifica.

L'app può impostare un elemento PendingIntent in CarAppExtender che viene inviato all'app quando l'utente tocca il widget HUN o il widget barra.

Se NotificationCompat.Builder.setOnlyAlertOnce viene chiamato con il valore true, una notifica di importanza elevata avvisa solo una volta nel file HUN.

Lo snippet seguente mostra come creare una notifica di navigazione:

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

Aggiorna regolarmente la notifica TBT per le modifiche della distanza, che aggiorna il widget ferroviario e mostra la notifica solo come HUN. Puoi controllare il comportamento di HUN impostando l'importanza della notifica con CarAppExtender.Builder.setImportance. Se imposti l'importanza su IMPORTANCE_HIGH, viene visualizzato un HUN. Impostandolo su un altro valore, viene aggiornato solo il widget barra laterale.

Aggiorna contenuto PlaceListNavigatorTemplate

Puoi consentire ai conducenti di aggiornare i contenuti semplicemente toccando un pulsante mentre sfogliano elenchi di luoghi creati con PlaceListNavigationTemplate. Per attivare l'aggiornamento dell'elenco, implementa il metodo onContentRefreshRequested dell'interfaccia OnContentRefreshListener e utilizza PlaceListNavigationTemplate.Builder.setOnContentRefreshListener per impostare il listener sul modello.

Lo snippet seguente mostra come impostare il listener sul modello:

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

Il pulsante di aggiornamento viene mostrato nell'intestazione di PlaceListNavigationTemplate solo se il listener ha un valore.

Quando l'utente fa clic sul pulsante di aggiornamento, viene richiamato il metodo onContentRefreshRequested della tua implementazione OnContentRefreshListener. All'interno di onContentRefreshRequested, chiama il metodo Screen.invalidate. L'host richiama quindi il metodo Screen.onGetTemplate della tua app per recuperare il modello con i contenuti aggiornati. Per ulteriori informazioni sull'aggiornamento dei modelli, consulta la sezione Aggiornare i contenuti di un modello. Se il modello successivo restituito da onGetTemplate è dello stesso tipo, viene conteggiato un aggiornamento e non viene conteggiato ai fini della quota del modello.

Fornisci indicazioni audio

Per riprodurre le indicazioni di navigazione sugli altoparlanti dell'auto, l'app deve richiedere l'audio attivo. Come parte di AudioFocusRequest, imposta l'utilizzo come AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE. Inoltre, imposta il guadagno dell'attenzione su AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.

Simula navigazione

Per verificare la funzionalità di navigazione dell'app quando la invii a Google Play Store, l'app deve implementare il callback NavigationManagerCallback.onAutoDriveEnabled. Quando viene richiamato questo callback, l'app deve simulare la navigazione verso la destinazione scelta quando l'utente inizia la navigazione. L'app può uscire da questa modalità ogni volta che il ciclo di vita dell'attuale Session raggiunge lo stato Lifecycle.Event.ON_DESTROY.

Puoi verificare che l'implementazione di onAutoDriveEnabled venga richiamata eseguendo quanto segue dalla riga di comando:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

Questo è quanto mostrato nell'esempio seguente:

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

App di navigazione predefinita per auto

In Android Auto, l'app di navigazione predefinita per auto corrisponde all'ultima app di navigazione avviata dall'utente. L'app predefinita riceve gli intent di navigazione quando l'utente richiama i comandi di navigazione tramite l'assistente o quando un'altra app invia un intent per avviare la navigazione.

Consenti agli utenti di interagire con la mappa

Puoi aggiungere il supporto per consentire agli utenti di interagire con le mappe, ad esempio consentendo loro di vedere parti diverse di una mappa mediante lo zoom e la panoramica. Ogni modello ha un requisito minimo per i livelli API di app per auto diversi. Consulta la seguente tabella per il livello minimo per il modello che vuoi implementare.

ModelloInterattività supportata dal livello API Car App
NavigationTemplate2
PlaceListNavigationTemplate4
RoutePreviewNavigationTemplate4
MapTemplate5

Metodi di SurfaceCallback

L'interfaccia di SurfaceCallback offre diversi metodi di callback che ti consentono di aggiungere interattività alle mappe create con i modelli NavigationTemplate, PlaceListNavigationTemplate, RoutePreviewNavigationTemplate o MapTemplate: onClick, onScroll, onScale e onFling. Consulta la tabella seguente per conoscere la relazione tra questi callback e le interazioni degli utenti.

Interazione SurfaceCallback metodo Funzionalità supportata a partire dal livello API Car App
Toccare onClick 5
Pizzica per eseguire lo zoom onScale 2
Trascinamento con un solo tocco onScroll 2
Scorrimento single-touch onFling 2
Tocca due volte onScale (con fattore di scala determinato dall'host del modello) 2
Movimento rotatorio in modalità panoramica onScroll (con fattore di distanza determinato dall'host del modello) 2

Striscia di azioni sulla mappa

I modelli NavigationTemplate, PlaceListNavigationTemplate, RoutePreviewNavigationTemplate e MapTemplate possono avere una barra di azione sulla mappa per azioni correlate alla mappa, come aumentare e diminuire lo zoom, ricentrare, mostrare una bussola e altre azioni che scegli di visualizzare. La barra delle azioni della mappa può avere fino a quattro pulsanti con sole icone che possono essere aggiornati senza influire sulla profondità dell'attività. Viene nascosta durante lo stato di inattività e viene visualizzata di nuovo nello stato attivo.

Per ricevere callback di interattività delle mappe, devi aggiungere un pulsante Action.PAN nella sequenza di azioni della mappa. Quando l'utente preme il pulsante Panoramica, l'host entra in modalità Panoramica, come descritto nella sezione seguente.

Se l'app omette il pulsante Action.PAN nella barra delle azioni della mappa, non riceve input utente dai metodi SurfaceCallback e l'host esce da qualsiasi modalità panoramica attivata in precedenza.

Su un touchscreen, il pulsante per la panoramica non viene visualizzato.

Modalità panoramica

In modalità panoramica, l'host del modello converte l'input utente da dispositivi di input non touch, come controller rotativi e touchpad, nei metodi SurfaceCallback appropriati. Rispondi all'azione dell'utente per attivare o uscire dalla modalità panoramica con il metodo setPanModeListener in NavigationTemplate.Builder. L'host può nascondere altri componenti dell'interfaccia utente nel modello mentre l'utente è in modalità panoramica.

Area stabile

L'area stabile viene aggiornata in base allo stato inattivo e allo stato attivo. Stabilisci se tracciare informazioni di guida, come velocità, limiti di velocità o avvisi stradali, in base alle dimensioni dell'area stabile, in modo che le informazioni importanti sulla mappa non siano ostruite dalla barra di azione della mappa.

Visualizza avvisi di navigazione contestualizzati

Alert mostra informazioni importanti al conducente con azioni facoltative e senza uscire dal contesto della schermata di navigazione. Per offrire la migliore esperienza al conducente, Alert opera all'interno di NavigationTemplate per evitare di bloccare il percorso di navigazione e ridurre al minimo le distrazioni alla guida.

Alert è disponibile solo all'interno di NavigationTemplate. Per inviare una notifica all'utente al di fuori di NavigationTemplate, valuta la possibilità di utilizzare una notifica in evidenza (HUN), come spiegato nella sezione Mostra notifiche.

Ad esempio, usa Alert per:

  • Informare il conducente di un aggiornamento pertinente alla navigazione corrente, ad esempio una modifica delle condizioni del traffico.
  • Chiedi al conducente di fornirti un aggiornamento relativo alla navigazione corrente, ad esempio l'esistenza di un autovelox.
  • Proponi un'attività imminente e chiedi se l'autista la accetta, ad esempio se è disposto a far salire qualcuno mentre si trova.

Nella sua forma di base, un Alert è costituito da un titolo e dalla durata di Alert. La durata è rappresentata da una barra di avanzamento. Se vuoi, puoi aggiungere un sottotitolo, un'icona e fino a due oggetti Action.

Figura 2. Avviso di navigazione contestuale.

Una volta visualizzato, un Alert non viene trasferito a un altro modello se l'interazione con il conducente comporta l'uscita da NavigationTemplate. Rimane nel NavigationTemplate originale fino al timeout di Alert, all'esecuzione di un'azione da parte dell'utente o all'eliminazione dell'Alert nell'app.

Crea un avviso

Utilizza Alert.Builder per creare un'istanza 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();

Se vuoi rimanere in ascolto per l'annullamento o l'ignoramento di Alert, crea un'implementazione dell'interfaccia di AlertCallback. I percorsi di chiamata AlertCallback sono:

Configura la durata degli avvisi

Scegli una durata di Alert che soddisfa le esigenze della tua app. La durata consigliata per una navigazione Alert è di 10 secondi. Consulta Avvisi di navigazione per ulteriori informazioni.

Mostra un avviso

Per mostrare una Alert, chiama il metodo AppManager.showAlert disponibile tramite l'app CarContext.

// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
  • Se chiami showAlert con un Alert che ha alertId uguale all'ID dell'Alert attualmente visualizzato, non succede nulla. Il Alert non si aggiorna. Per aggiornare un Alert, devi ricrearlo con un nuovo alertId.
  • Se chiami showAlert con un Alert che ha una alertId diversa da quella del Alert attualmente visualizzato, verrà ignorato il Alert attualmente visualizzato.

Ignorare un avviso

Mentre una Alert si chiude automaticamente a causa del timeout o di un'interazione con il conducente, puoi anche chiudere manualmente una Alert, ad esempio se le sue informazioni diventano obsolete. Per ignorare un elemento Alert, chiama il metodo dismissAlert con la alertId di Alert.

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

Una chiamata a dismissAlert con un alertId che non corrisponde al Alert attualmente visualizzato non produce alcun risultato. e non genera eccezioni.