Wykrywaj zdarzenia nawigacji

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

Przegląd

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

Wyświetlanie kodu

Wykrywanie przybycia do miejsca docelowego

Miejsce docelowe to miejsce docelowe lub punkt pośredni. Aby wykryć przybycie, wywołaj funkcję Navigator.addArrivalListener(), która rejestruje wywołanie zwrotne, gdy urządzenie dotrze do miejsca docelowego.

Po dotarciu na miejsce pakiet Navigation SDK na Androida wywołuje funkcję zwrotną onArrival(), której można użyć do zatrzymania wskazówek dojazdu krok po kroku za pomocą funkcji Navigator.stopGuidance() lub do przejścia do następnego punktu trasy za pomocą funkcji Navigator.continueToNextDestination(). Jeśli sesja nawigacji obejmowała tylko 1 miejsce docelowe lub jeśli na liście nie ma już żadnych miejsc docelowych, wywołanie funkcji Navigator.continueToNextDestination() automatycznie zatrzymuje wskazówki.

Gdy zadzwonisz pod numer continueToNextDestination(), nawigator odrzuci wszystkie informacje o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o poprzednim odcinku trasy, musisz pobrać je z nawigatora przed wywołaniem funkcji continueToNextDestination().

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

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 RoadSnappedLocationProviderNavigationApi, a następnie zadzwoń pod numer RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować się w celu otrzymywania oddzwonienia, gdy zmieni się lokalizacja lub kierunek urządzenia. Pamiętaj, że ta lokalizacja jest przyciągana do drogi, więc może się różnić od lokalizacji zwracanej przez dostawcę lokalizacji łączonej w interfejsach API lokalizacji Usług Google Play.

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

Aktualizacje lokalizacji przyciągane do drogi są niezależne od nawigacji i mogą być kontynuowane nawet po jej zatrzymaniu. Subskrypcja aktualizacji lokalizacji może powodować szybsze wyczerpywanie się baterii, wyciek pamięci lub niezamierzone zbieranie danych o lokalizacji urządzenia, jeśli pozostawisz aktualizacje lokalizacji działające w tle. Wywołaj RoadSnappedLocationProvider.removeLocationListener gdy nie potrzebujesz już odbiornika.

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

Otrzymywanie aktualizacji czasu i odległości

Wywołaj funkcję Navigator.addRemainingTimeOrDistanceChangedListener() aby zarejestrować się w celu otrzymania połączenia zwrotnego, gdy pozostały czas (w sekundach) lub odległość (w metrach) zmieni się o wartość większą niż podany próg.

Gdy zmiana czasu lub odległości przekroczy określoną wartość, pakiet Navigation SDK wywoła funkcję zwrotną 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 pośredniego, a nie od jednego punktu pośredniego do drugiego. Obiekt TimeAndDistance zwraca teraz też delaySeverity. Ten wyliczenie będzie miało wartość heavy, medium, light lub unknown. Odpowiada to kolorowi, który widzisz w interfejsie Map Google (duże natężenie = czerwony, średnie = żółty, małe = zielony). Jest to przydatne, jeśli chcesz utworzyć własny stopkę z szacowanym czasem dotarcia.

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

W przykładzie poniżej żądanie oddzwonienia jest wysyłane, jeśli pozostały czas zmieni się o ponad 60 sekund lub pozostała odległość zmieni się 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);
            }
        });

Możesz wyświetlać informacje o pozostałym czasie i dystansie na wbudowanym wyświetlaczu, korzystając z 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.

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

Otrzymywanie aktualizacji trasy

Zadzwoń pod numer Navigator.addRouteChangedListener(), aby zarejestrować się w celu otrzymywania połączeń zwrotnych, gdy trasa ulegnie zmianie.

Gdy trasa się zmieni, Navigation SDK wywoła funkcję zwrotną onRouteChanged(). Możesz zadzwonić pod numer Navigator.getRouteSegments lub Navigator.getCurrentRouteSegment(), aby znaleźć nową trasę.

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

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

Wykrywanie zmian trybu nocnego

Wywołaj funkcję NavigationView.addOnNightModeChangedListener lub SupportNavigationFragment.addOnNightModeChangedListener aby zarejestrować się w celu otrzymania wywołania zwrotnego, gdy zmieni się tryb nocny.

Poniższy przykład pokazuje nasłuchiwanie zmian trybu nocnego w 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.