Wykrywaj zdarzenia nawigacji

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

Omówienie

Aby nasłuchiwać zdarzeń nawigacji, użyj tych interfejsów:

Zobacz kod

Wykrywanie przybycia do miejsca docelowego

Tutaj „miejsce docelowe” oznacza miejsce docelowe lub punkt pośredni. Aby wykryć przyjazd urządzenia, 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. Aby przejść do następnego punktu orientacyjnego, musisz wyraźnie wywołać Navigator.continueToNextDestination(), a aby kontynuować nawigację zakręt po zakręcie – Navigator.startGuidance().

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

Aby uniknąć wycieku pamięci, musisz wywołać funkcję removeArrivalListener(listener), gdy nie będziesz już potrzebować odsłuchiwania.

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

otrzymywać powiadomienia o zmianach lokalizacji.

Uzyskaj RoadSnappedLocationProviderNavigationApi, a potem zadzwoń pod numer RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować się na oddzwonienie, gdy zmieni się lokalizacja lub kierunek urządzenia. Pamiętaj, że ta lokalizacja jest przypięta do drogi, więc może się różnić od lokalizacji zwróconej przez połączonego dostawcę lokalizacji w interfejsach API lokalizacji Usług Google Play.

Pakiet SDK do nawigacji przekazuje aktualizacje lokalizacji tak często, jak to możliwe. Gdy jest dostępna aktualizacja lokalizacji, pakiet SDK nawigacji wywołuje funkcję onLocationChanged().

Aktualizacje lokalizacji na podstawie danych z mapy są niezależne od nawigacji i mogą być kontynuowane nawet po jej zatrzymaniu. Subskrybowanie aktualizacji lokalizacji może powodować szybsze zużycie baterii, wyciek pamięci lub niezamierzone zbieranie danych o lokalizacji urządzenia, jeśli pozostawisz aktualizacje lokalizacji działające w tle. Zadzwoń do RoadSnappedLocationProvider.removeLocationListener, gdy nie potrzebujesz już słuchacza.

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

otrzymywać informacje o czasie i odległości;

Zadzwoń pod numer Navigator.addRemainingTimeOrDistanceChangedListener() , aby zarejestrować się na połączenie 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 ustaloną wartość, pakiet Navigation SDK uruchamia wywołanie zwrotne onRemainingTimeOrDistanceChanged().

Aby sprawdzić pozostały czas i odległość, zadzwoń pod numer Navigator.getTimeAndDistanceList(). Pamiętaj, że czasy i odległości na liście są skumulowane: pokazują czas i odległość od bieżącej lokalizacji do każdego punktu kontrolnego, a nie od jednego punktu do drugiego. Obiekt TimeAndDistance zwraca teraz także delaySeverity. Ten typ może być ciężki, średni, lekki lub nieznany. Odpowiada on kolorowi, który widzisz w etapie w interfejsie Map (intensywny = czerwony, średni = żółty, jasny = zielony). Jest to przydatne, jeśli chcesz utworzyć własny nagłówek lub stopkę.

Aby uniknąć wycieku pamięci, musisz wywołać funkcję Navigator.removeRemainingTimeOrDistanceChangedListener(listener), gdy nie potrzebujesz już listenera.

Przykład poniżej prosi o połączenie zwrotne, jeśli pozostały czas zmieni się o więcej niż 60 sekund lub pozostała odległość o więcej niż 100 metrów.

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

Możesz wyświetlić pozostały czas i odległość, korzystając z wbudowanego wyświetlacza, używając metody setEtaCardEnabled() i przekazując parametr o wartości TRUE. Aby wyłączyć wyświetlanie czasu i odległości, ustaw tę wartość na FALSE.

Czas dojazdu do wielu punktów pośrednich możesz też wyświetlić, używając metody getTimeAndDistanceList().

otrzymywać powiadomienia o aktualizacjach trasy.

Zadzwoń pod numer Navigator.addRouteChangedListener(), aby zarejestrować się na oddzwonienie, gdy zmieni się trasa.

Gdy trasa się zmieni, Navigation SDK wywoła funkcję onRouteChanged(). Aby poznać nową trasę, zadzwoń pod numer Navigator.getRouteSegments lub Navigator.getCurrentRouteSegment().

Aby uniknąć wycieków pamięci, musisz wywołać funkcję removeRouteChangedListener(listener), gdy nie będziesz już potrzebować listenera.

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, gdy tryb nocny się zmieni.

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

Tryb nocny możesz też ustawić automatycznie. Więcej informacji znajdziesz w artykule Ustawianie trybu nocnego.