Wykrywaj zdarzenia nawigacji

Aplikacja może nasłuchiwać zdarzeń, które mają miejsce, gdy użytkownik porusza się po trasie.

Przegląd

Te interfejsy pozwalają nasłuchiwać zdarzeń nawigacji:

Zobacz kod

Wykrywanie przybycia do celu

W tym przypadku cel podróży oznacza ostateczny cel podróży lub punkt pośredni. Aby wykryć przyjazd, wywołaj metodę Navigator.addArrivalListener(), która rejestruje wywołanie zwrotne po dotarciu urządzenia do miejsca docelowego.

Po dotarciu do celu pakiet Navigation SDK na Androida uruchamia wywołanie zwrotne onArrival() i zatrzymuje szczegółowe wskazówki. Musisz wywołać metodę Navigator.continueToNextDestination(), aby przejść do następnego punktu pośredniego, oraz Navigator.startGuidance(), aby kontynuować nawigację zakręt po zakręcie.

Gdy wywołujesz continueToNextDestination(), nawigator odrzuca wszystkie informacje o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o poprzednim fragmencie trasy, musisz je pobrać z nawigatora przed wywołaniem funkcji continueToNextDestination().

Aby uniknąć wycieków pamięci, musisz wywołać removeArrivalListener(listener), gdy nie potrzebujesz już detektora.

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

Otrzymywanie aktualizacji lokalizacji

Uzyskaj RoadSnappedLocationProvider z NavigationApi, a następnie wywołaj RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować się na wywołanie zwrotne w przypadku zmiany lokalizacji lub nagłówka urządzenia. Pamiętaj, że ta lokalizacja jest przypisana do drogi, więc może się różnić od lokalizacji zwróconej przez dostawcę uśrednionej lokalizacji w interfejsach API lokalizacji w usługach Google Play.

Pakiet Navigation SDK dostarcza aktualizacje lokalizacji tak często, jak to możliwe. Gdy dostępna jest aktualizacja lokalizacji, pakiet Navigation SDK uruchamia wywołanie zwrotne onLocationChanged().

Aktualizacje lokalizacji przypisanych do dróg są niezależne od nawigacji i mogą być kontynuowane nawet po zatrzymaniu nawigacji. Subskrybowanie aktualizacji lokalizacji może powodować wyczerpywanie się baterii, wyciek pamięci lub niezamierzone zbieranie danych o lokalizacji urządzenia, jeśli aktualizacje lokalizacji będą działać w tle. Wywołaj polecenie RoadSnappedLocationProvider.removeLocationListener, gdy nie potrzebujesz już detektora.

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

Otrzymuj aktualne informacje o czasie i dystansie

Wywołaj Navigator.addRemainingTimeOrDistanceChangedListener(), aby zarejestrować wywołanie zwrotne, gdy pozostały czas (w sekundach) lub odległość (w metrach) zmieni się o więcej niż określony próg.

Gdy zmiana czasu lub odległości przekroczy określoną wartość, pakiet Navigation SDK uruchamia wywołanie zwrotne onRemainingTimeOrDistanceChanged().

Aby sprawdzić pozostały czas i dystans, wywołaj Navigator.getTimeAndDistanceList(). Pamiętaj, że czasy i odległości na liście są kumulowane: pokazują czas i odległość od bieżącego miejsca do każdego punktu na trasie, a nie z jednego punktu do drugiego. Obiekt TimeAndDistance zwraca teraz także delaySeverity. Wartość tego typu może być obszerna, śródmienna, lekka lub nieznana. Odpowiada to kolorowi widocznemu na eta w interfejsie Map (intensywny = czerwony, średni = żółty, jasno = zielony). Jest to przydatne, jeśli chcesz utworzyć własną stopkę eta.

Aby uniknąć wycieków pamięci, musisz wywołać Navigator.removeRemainingTimeOrDistanceChangedListener(listener), gdy nie potrzebujesz już detektora.

Poniższy przykład wymaga wywołania zwrotnego, jeśli pozostały czas zmieni się o ponad 60 sekund lub pozostała odległość o ponad 100 metrów.

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

Informacje o pozostałym czasie i odległości możesz wyświetlić we wbudowanym wyświetlaczu, używając metody setEtaCardEnabled() i przekazując parametr o wartości TRUE. Aby wyłączyć wyświetlanie czasu/odległości, ustaw tę wartość na FALSE.

Możesz też udostępnić szacowany czas dotarcia na miejsce dla wielu punktów pośrednich za pomocą metody getTimeAndDistanceList().

Otrzymuj aktualne informacje o trasach

Zadzwoń pod numer Navigator.addRouteChangedListener(), aby zarejestrować się na wywołanie zwrotne po zmianie trasy.

Gdy trasa się zmieni, pakiet Navigation SDK uruchamia wywołanie zwrotne onRouteChanged(). Aby znaleźć nową trasę, możesz zadzwonić pod numer Navigator.getRouteSegments i Navigator.getCurrentRouteSegment().

Aby uniknąć wycieków pamięci, musisz wywołać removeRouteChangedListener(listener), gdy nie potrzebujesz już detektora.

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

Wykrywaj po zmianie trybu nocnego

Zadzwoń pod numer NavigationView.addOnNightModeChangedListener lub SupportNavigationFragment.addOnNightModeChangedListener, aby zarejestrować się na oddzwonienie po zmianie trybu nocnego.

Poniższy przykład pokazuje nasłuchiwanie zmian trybu nocnego we fragmencie nawigacji.

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