Ascolta gli eventi di navigazione

La tua app può ascoltare gli eventi che si verificano mentre l'utente naviga lungo un percorso.

Panoramica

Utilizza le seguenti interfacce per rilevare gli eventi di navigazione:

Visualizza il codice

Rilevare l'arrivo a una destinazione

In questo caso, una destinazione si riferisce a una destinazione finale o a una tappa intermedia. Per rilevare l'arrivo, chiama il numero Navigator.addArrivalListener(), che si registra per una richiamata quando il dispositivo raggiunge una destinazione.

All'arrivo, l'SDK Navigation per Android attiva il callback onArrival(), che può essere utilizzato per interrompere le indicazioni stradali dettagliate utilizzando Navigator.stopGuidance() o per passare al waypoint successivo utilizzando Navigator.continueToNextDestination(). Se la sessione di navigazione includeva una sola destinazione o se non sono rimaste destinazioni nell'elenco, la chiamata a Navigator.continueToNextDestination() interrompe automaticamente la guida.

Quando chiami continueToNextDestination(), il navigatore scarta tutte le informazioni sulla destinazione precedente. Se vuoi analizzare le informazioni sul segmento di percorso precedente, devi recuperarle dal navigatore prima di chiamare continueToNextDestination().

Per evitare perdite di memoria, devi chiamare removeArrivalListener(listener) quando non hai più bisogno del listener.

mNavigator.addArrivalListener(new Navigator.ArrivalListener() {
    @Override
    public void onArrival(ArrivalEvent arrivalEvent) {
        displayMessage("onArrival: You've arrived at a waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_BOTH);
        // Start turn-by-turn guidance for the next leg of the route.
        if (arrivalEvent.isFinalDestination()) {
            displayMessage("onArrival: You've arrived at the final destination.",
                    DISPLAY_BOTH);
        } else {
            mNavigator.continueToNextDestination();
            mNavigator.startGuidance();
        }
    }
});

Ricevere aggiornamenti sulla posizione

Ottieni un RoadSnappedLocationProvider da NavigationApi, poi chiama RoadSnappedLocationProvider.addLocationListener() per registrarti per una richiamata quando la posizione o la direzione del dispositivo cambiano. Tieni presente che questa posizione viene agganciata a una strada, pertanto potrebbe essere diversa dalla posizione restituita dal fornitore di geolocalizzazione combinata nelle API di localizzazione di Google Play Services.

L'SDK Navigation fornisce aggiornamenti della posizione il più spesso possibile. Quando è disponibile un aggiornamento della posizione, l'SDK Navigation attiva il callback onLocationChanged().

Gli aggiornamenti della posizione con snapping stradale sono indipendenti dalla navigazione e possono continuare anche dopo l'interruzione della navigazione. L'iscrizione agli aggiornamenti della posizione potrebbe causare un consumo eccessivo della batteria, una perdita di memoria o la raccolta involontaria di dati sulla posizione del dispositivo se lasci gli aggiornamenti della posizione in esecuzione in background. Chiama RoadSnappedLocationProvider.removeLocationListener quando non hai più bisogno dell'ascoltatore.

mRoadSnappedLocationProvider =
        NavigationApi.getRoadSnappedLocationProvider(getApplication());
if (mRoadSnappedLocationProvider != null) {
    mRoadSnappedLocationProvider.addLocationListener(
            new RoadSnappedLocationProvider.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    displayMessage("onLocationUpdated: Navigation engine has provided a new"
                                    +   " road-snapped location: "
                                    +   location.toString(),
                            DISPLAY_LOG);
                }
            });
} else {
    displayMessage("ERROR: Failed to get a location provider", DISPLAY_LOG);
}

Ricevere aggiornamenti su tempo e distanza

Chiama Navigator.addRemainingTimeOrDistanceChangedListener() per registrarti a una richiamata quando il tempo rimanente (secondi) o la distanza (metri) cambia di più di una determinata soglia.

Quando la variazione di tempo o distanza supera l'importo specificato, l'SDK Navigation attiva il callback onRemainingTimeOrDistanceChanged().

Per conoscere il tempo e la distanza rimanenti, chiama Navigator.getTimeAndDistanceList(). Tieni presente che i tempi e le distanze nell'elenco sono cumulativi: mostrano il tempo e la distanza dalla posizione attuale a ogni waypoint, non da un waypoint all'altro. L'oggetto TimeAndDistance ora restituisce anche delaySeverity. Questo enum sarà pesante, medio, leggero o sconosciuto. Corrisponde al colore visualizzato nell'ETA nell'interfaccia utente di Maps (intenso = rosso, medio = giallo, leggero = verde). Questa opzione è utile se devi creare un piè di pagina ETA personalizzato.

Per evitare perdite di memoria, devi chiamare Navigator.removeRemainingTimeOrDistanceChangedListener(listener) quando non hai più bisogno del listener.

L'esempio riportato di seguito richiede un callback se il tempo rimanente cambia di più di 60 secondi o la distanza rimanente cambia di più di 100 metri.

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        +   " has changed.",
                        DISPLAY_LOG);
            }
        });

Puoi mostrare le informazioni su tempo e distanza rimanenti utilizzando il display integrato utilizzando il metodo setEtaCardEnabled() e passando un parametro con il valore TRUE. Per disattivare la visualizzazione di tempo e distanza, imposta questo valore su FALSE.

Puoi anche esporre l'ETA per più tappe utilizzando il metodo getTimeAndDistanceList().

Ricevere aggiornamenti sul percorso

Chiama il numero Navigator.addRouteChangedListener() per registrarti per un richiamo quando il percorso cambia.

Quando il percorso cambia, l'SDK Navigation attiva il callback onRouteChanged(). Puoi chiamare Navigator.getRouteSegments e Navigator.getCurrentRouteSegment() per trovare il nuovo itinerario.

Per evitare perdite di memoria, devi chiamare removeRouteChangedListener(listener) quando non hai più bisogno del listener.

mNavigator.addRouteChangedListener(new Navigator.RouteChangedListener() {
    @Override
    public void onRouteChanged() {
        displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_LOG);
    }
});

Rilevare quando cambia la modalità notturna

Chiama NavigationView.addOnNightModeChangedListener o SupportNavigationFragment.addOnNightModeChangedListener per registrarti e ricevere una richiamata quando la modalità notturna cambia.

L'esempio seguente mostra l'ascolto delle modifiche alla modalità notturna in un fragment di navigazione.

mNavFragment.addOnNightModeChangedListener(new NavigationView.OnNightModeChangedListener() {
    @Override
    public void onNightModeChanged(NightModeChangedEvent nightModeChangedEvent) {
        displayMessage("Night mode is active: " + nightModeChangedEvent.inNightMode(),
        DISPLAY_LOG);
    }
});

Puoi anche impostare la modalità notturna in modo programmatico. Per ulteriori informazioni, vedi Impostare la modalità Notte.