Ascolta gli eventi di navigazione

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

Panoramica

Utilizza le seguenti interfacce per ascoltare gli eventi di navigazione:

Visualizza il codice

Rilevare l'arrivo a una destinazione

Qui, una destinazione si riferisce a una destinazione finale o a una fermata intermedia. Per rilevare l'arrivo, chiama il numero Navigator.addArrivalListener(), che registra un callback quando il dispositivo raggiunge una destinazione.

All'arrivo, l'SDK di navigazione per Android attiva il callback onArrival() e interrompe le indicazioni passo passo. Devi chiamare esplicitamente Navigator.continueToNextDestination() per passare al waypoint successivo e Navigator.startGuidance() per continuare la navigazione passo passo.

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

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

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 dal NavigationApi, quindi chiama RoadSnappedLocationProvider.addLocationListener() per registrarti per un richiamata quando la posizione o la direzione del dispositivo cambiano. Tieni presente che questa posizione è associata a una strada e potrebbe essere diversa da quella restituita dal provider di posizione combinato 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 sincronizzati sulla strada sono indipendenti dalla navigazione e possono continuare anche dopo l'interruzione della navigazione. L'abbonamento agli aggiornamenti della posizione può causare il consumo della batteria, una perdita di memoria o la raccolta accidentale di dati sulla posizione del dispositivo se gli aggiornamenti della posizione sono 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 per un 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 di navigazione 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 corrente a ogni waypoint, non da un waypoint all'altro. L'oggetto TimeAndDistance ora restituisce anche delaySeverity. Questo enum può essere heavy, meduim, light o unknown. Corrisponde al colore visualizzato su eta nell'interfaccia utente di Maps (intenso = rosso, medio = giallo, chiaro = verde). Questa opzione è utile se devi creare il tuo piè di pagina per l'orario di arrivo stimato.

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

L'esempio riportato di seguito richiede un riaccompanhamento se il tempo rimanente cambia di più di 60 secondi o se 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 rimanente e distanza utilizzando il display integrato utilizzando il metodo setEtaCardEnabled() e passando un parametro con il valore TRUE. Per eliminare la visualizzazione di tempo e distanza, imposta questo valore su FALSE.

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

Ricevi aggiornamenti sui percorsi

Chiama il numero Navigator.addRouteChangedListener() per registrarti per 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 dell'ascoltatore.

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 la modalità notturna cambia

Chiama NavigationView.addOnNightModeChangedListener o SupportNavigationFragment.addOnNightModeChangedListener per registrarti per una chiamata quando la modalità notturna cambia.

L'esempio seguente mostra l'ascolto delle modifiche della 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 ulteriori informazioni, vedi Impostare la modalità notturna.