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

L'app di navigazione deve dichiarare la androidx.car.app.category.NAVIGATION categoria di app auto nel filtro per intent della sua 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>

Intenti di navigazione dell'assistenza

Per supportare gli intent di navigazione verso la tua app, inclusi quelli provenienti dall'Assistente Google tramite 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.

Accedi ai modelli di navigazione

Le app di navigazione possono accedere ai seguenti modelli specificamente progettati 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 le stime di viaggio durante la navigazione attiva.
  • MapTemplate: presenta una versione compatta di un elenco (ad esempio ListTemplate) o di un riquadro (informazioni dettagliate con azioni in evidenza, come in PaneTemplate) accanto a una mappa.
  • PlaceListNavigationTemplate: mostra anche un elenco di luoghi, i cui indicatori corrispondenti possono essere disegnati nella mappa.
  • RoutePreviewNavigationTemplate: mostra anche un elenco di route, una delle quali può essere selezionata ed evidenziata nella mappa.

Per ulteriori dettagli 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"/>

Disegnare la mappa

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

È quindi possibile accedere a un oggetto SurfaceContainer 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 elementi dell'interfaccia utente per i modelli nella parte superiore della mappa. L'host comunica l'area che è garantita non essere ostruita 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 nella parte superiore, questa può nascondersi quando l'utente non interagisce con lo schermo per un po' di tempo, per liberare spazio per la mappa. In questo caso, c'è un callback a onStableAreaChanged e onVisibleAreaChanged con lo stesso rettangolo. Quando la barra delle azioni è nascosta, viene chiamata solo onVisibleAreaChanged con l'area più grande. Se l'utente interagisce con lo schermo, viene richiamata solo onVisibleAreaChanged con il primo rettangolo.

Supporta la modalità Buio

Le app di navigazione devono tracciare nuovamente la mappa nell'istanza Surface con i colori scuri corretti quando l'host determina 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 ulteriori metadati di navigazione con l'host. L'host utilizza le informazioni per fornire informazioni all'unità principale del veicolo e per evitare che le applicazioni di navigazione si scontrino sulle 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 relative ai percorsi e dati sul cluster di veicoli, deve conoscere lo stato attuale della navigazione. Quando un utente avvia la navigazione, chiama NavigationManager.navigationStarted. Analogamente, quando termina la navigazione, 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 nel bel mezzo di una corsa, utilizza Trip.Builder.setLoading(true).

A volte, l'host ha bisogno di un'app per interrompere la navigazione e le chiamate 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.

Aggiorna le informazioni di viaggio

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 l'elemento Step aggiunto a Trip, ma non le informazioni Destination.

Utilizzo della 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 eseguire il rendering dei propri contenuti direttamente sul display del cluster (nei veicoli supportati), con le seguenti limitazioni:

  • L'API di visualizzazione del cluster non supporta i controlli di input
  • Il display del cluster deve mostrare solo riquadri della mappa. Facoltativamente, su questi riquadri può essere visualizzata una navigazione del percorso attiva.
  • L'API di visualizzazione del cluster supporta solo l'utilizzo della classe NavigationTemplate
    • A differenza dei display principali, i display dei cluster potrebbero non mostrare in modo coerente tutti gli elementi dell'interfaccia utente di NavigationTemplate, ad esempio istruzioni passo passo, schede ETA e azioni. I riquadri della mappa sono l'unico elemento UI visualizzato 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 richiede un parametro di tipo SessionInfo che fornisce informazioni aggiuntive sul Session creato (ovvero il tipo di visualizzazione e il set di modelli supportati).

Le app possono 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 ogni 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 riguardo a quando o se viene fornito il display del cluster. Inoltre, è possibile che il cluster Session sia l'unico Session (ad esempio, l'utente ha scambiato il display principale con un'altra app durante la navigazione attiva della tua app). 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 non è mai possibile ricevere la visualizzazione del cluster. Spetta all'app gestire questi scenari eseguendo il rendering dello stato di inattività dei riquadri della mappa.

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

Supporto del cluster di test

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 un testo o un'icona

Per personalizzare la stima di viaggio con testo, un'icona o entrambi, utilizza i metodi setTripIcon o setTripText del corso.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.

Il seguente snippet utilizza setTripIcon e setTripText per personalizzare la stima di 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

Fornisci istruzioni di navigazione passo passo (TBT) utilizzando una notifica di navigazione aggiornata di frequente. Affinché venga trattata come una notifica di navigazione nello schermo dell'auto, il generatore di notifiche deve:

  1. Contrassegna la notifica come in corso 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 dei binari 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 nella sezione CarAppExtender che viene inviato all'app quando l'utente tocca il widget HUN o il widget rail.

Se NotificationCompat.Builder.setOnlyAlertOnce viene chiamato con il valore true, una notifica di importanza elevata avvisa solo una volta nell'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 variazioni di distanza, il widget dei binari viene aggiornato e la notifica viene visualizzata 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. Se lo imposti su un altro valore, viene aggiornato solo il widget rail.

Aggiorna i contenuti di 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 visualizzato 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. A questo punto, l'host richiama il metodo Screen.onGetTemplate della tua app per recuperare il modello con i contenuti aggiornati. Per ulteriori informazioni sull'aggiornamento dei modelli, consulta Aggiornare i contenuti di un modello. Finché il successivo modello restituito da onGetTemplate è dello stesso tipo, viene conteggiato un aggiornamento e non viene conteggiato ai fini della quota di modelli.

Fornisci indicazioni audio

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

Simula navigazione

Per verificare la funzionalità di navigazione dell'app quando la invii al Google Play Store, l'app deve implementare il callback NavigationManagerCallback.onAutoDriveEnabled. Quando viene chiamato 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 le seguenti operazioni dalla riga di comando:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

come illustrato 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 predefinita per l'auto di navigazione 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 tua mappa

Puoi aggiungere il supporto per l'interazione degli utenti con le mappe, ad esempio consentendo loro di vedere parti diverse di una mappa con lo zoom e la panoramica. Ogni modello ha un requisito minimo diverso per il livello API dell'API Car App. Consulta la seguente tabella per il livello minimo del modello da implementare.

ModelloInterattività supportata a partire dal livello API Car App
NavigationTemplate2
PlaceListNavigationTemplate4
RoutePreviewNavigationTemplate4
MapTemplate 5

Metodi di callback di superficie

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 di seguito per conoscere la relazione tra questi callback e le interazioni degli utenti.

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

Striscia di azioni sulla mappa

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

Per ricevere callback interattività della mappa, devi aggiungere un pulsante Action.PAN nella barra delle 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 l'input utente dai metodi SurfaceCallback e l'host esce da qualsiasi modalità panoramica attivata in precedenza.

Sui 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 tra stato inattivo e attivo. Stabilisci se tracciare informazioni di guida, ad esempio 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 al conducente informazioni importanti con azioni facoltative, senza uscire dal contesto della schermata di navigazione. Per offrire al conducente un'esperienza ottimale, 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 in Mostra notifiche.

Ad esempio, usa Alert per:

  • Informa il conducente di un aggiornamento pertinente alla navigazione corrente, come una modifica delle condizioni del traffico.
  • Chiedi al conducente un aggiornamento relativo alla navigazione corrente, ad esempio l'esistenza di un autovelox.
  • Proponi un'attività imminente e chiedi se il conducente 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 elemento Alert non viene trasferito a un altro modello se l'interazione del conducente determina l'uscita da NavigationTemplate. Rimane nel NavigationTemplate originale fino al timeout di Alert, all'utente intraprende un'azione o all'app ignora il Alert.

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 di Alert annullamento o chiusura, crea un'implementazione dell'interfaccia AlertCallback. I percorsi di chiamata AlertCallback sono:

Configura durata avviso

Scegli una durata della Alert che soddisfa le esigenze della tua app. La durata consigliata per una navigazione Alert è 10 secondi. Per saperne di più, consulta la sezione Avvisi di navigazione.

Mostra un avviso

Per mostrare un Alert, chiama il metodo AppManager.showAlert disponibile tramite il CarContext della tua app.

// 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. Alert non si aggiorna. Per aggiornare un elemento Alert, devi ricrearlo con un nuovo alertId.
  • Se chiami showAlert con un Alert che ha una alertId diversa da quella di Alert attualmente visualizzata, il Alert attualmente visualizzato verrà ignorato.

Ignorare un avviso

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

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

Se chiami dismissAlert con un alertId che non corrisponde al Alert attualmente visualizzato, non succede nulla. Non genera alcuna eccezione.