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 ascoltare gli eventi di navigazione:

Visualizza il codice

Rileva l'arrivo a una destinazione

In questo caso, una destinazione si riferisce a una destinazione finale o a un waypoint. Per rilevare l'arrivo, chiama Navigator.addArrivalListener(), che si registra per un callback 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 passo passo 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 le indicazioni stradali.

Quando chiami continueToNextDestination(), il navigatore ignora 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();
        }
    }
});

Ricevi aggiornamenti sulla posizione

Ottieni un RoadSnappedLocationProvider da NavigationApi, quindi chiama RoadSnappedLocationProvider.addLocationListener() per registrarti per un callback quando la posizione o la direzione del dispositivo cambiano. Tieni presente che questa posizione è agganciata a una strada, pertanto potrebbe essere diversa da quella restituita dal Fused Location Provider nelle API di geolocalizzazione di Google Play Services.

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

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

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

Ricevi aggiornamenti su tempo e distanza

Chiama Navigator.addRemainingTimeOrDistanceChangedListener() per registrarti per una richiamata quando il tempo rimanente (secondi) o la distanza (metri) cambiano di un valore superiore a una determinata soglia.

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

Per trovare 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 corrente a ogni waypoint, non da un waypoint all'altro. L'oggetto TimeAndDistance restituisce anche delaySeverity. Questo enum è HEAVY, MEDIUM, LIGHT o UNKNOWN. Questo corrisponde al colore che vedi per l'orario di arrivo stimato nell'interfaccia utente di Maps (traffico intenso = rosso, moderato = giallo, scarso = verde). Questo è utile se devi creare il tuo piè di pagina ETA.

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

L'esempio seguente richiede un callback se il tempo rimanente cambia di oltre 60 secondi o se la distanza rimanente cambia di oltre 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 sul tempo e sulla distanza rimanenti utilizzando il display integrato con il metodo setEtaCardEnabled() e passando un parametro con il valore TRUE. Per sopprimere la visualizzazione di tempo e distanza, imposta questo valore su FALSE.

Puoi anche esporre l'orario di arrivo stimato per più tappe utilizzando il metodo getTimeAndDistanceList().

Ricevi aggiornamenti sul percorso

Chiama Navigator.addRouteChangedListener() per registrare un callback 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 percorso.

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

Rileva quando cambia la modalità notturna

Chiama NavigationView.addOnNightModeChangedListener o NavigationFragment.addOnNightModeChangedListener per registrarti per un callback quando cambia la modalità notturna.

L'esempio seguente mostra l'ascolto delle modifiche alla modalità notturna in un frammento 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 saperne di più, consulta Imposta la modalità notturna.