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świetl kod

wykrywanie dotarcia do miejsca docelowego,

W tym przypadku miejsce docelowe oznacza miejsce docelowe lub punkt na trasie. Aby wykryć przyjazd, wywołaj metodę 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 wywołanie zwrotne onArrival(), które można następnie użyć do zatrzymania szczegółowych wskazówek dojazdu za pomocą Navigator.stopGuidance() lub przejścia do następnego punktu orientacyjnego za pomocą Navigator.continueToNextDestination(). Jeśli sesja nawigacji obejmowała tylko 1 miejsce docelowe lub na liście miejsc docelowych nie ma już żadnych miejsc docelowych, wywołanie metody Navigator.continueToNextDestination() automatycznie zatrzymuje wskazówki.

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

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

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 informacji o zmianie lokalizacji

Uzyskaj RoadSnappedLocationProvider z  NavigationApi, a następnie wywołaj RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować wywołanie zwrotne, 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ę uśrednionej lokalizacji w interfejsach API lokalizacji Usług Google Play.

Pakiet SDK do nawigacji aktualizuje lokalizację tak często, jak to możliwe. Gdy dostępna jest informacja o zmianie lokalizacji, pakiet Navigation SDK wywołuje wywołanie zwrotne onLocationChanged().

Aktualizacje lokalizacji przyciągnięte do drogi są niezależne od nawigacji i mogą być kontynuowane nawet po zatrzymaniu nawigacji. Subskrybowanie informacji o zmianie lokalizacji może powodować rozładowywanie baterii, wyciek pamięci lub niezamierzone zbieranie danych o lokalizacji urządzenia, jeśli informacje o zmianie lokalizacji będą działać w tle. Gdy detektor nie będzie już potrzebny, wywołaj funkcję RoadSnappedLocationProvider.removeLocationListener.

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 aktualnych informacji o czasie i odległości

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ż podany próg.

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

Aby sprawdzić pozostały czas i odległość, wywołaj Navigator.getTimeAndDistanceList(). Pamiętaj, że czasy i odległości na liście są sumowane: 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 też delaySeverity. Ten typ wyliczeniowy to HEAVY, MEDIUM, LIGHT lub UNKNOWN. Odpowiada to kolorowi szacowanego czasu dotarcia na miejsce w interfejsie Map (duże = czerwony, średnie = żółty, małe = zielony). Jest to przydatne, jeśli chcesz utworzyć własną stopkę z szacowanym czasem dotarcia na miejsce.

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

Poniższy przykład żąda wywołania zwrotnego, 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 odległości na wbudowanym wyświetlaczu, używając metody setEtaCardEnabled() i przekazując parametr o wartości TRUE. Aby ukryć wyświetlanie czasu i odległości, ustaw tę wartość na FALSE.

Możesz też wyświetlać szacowany czas dotarcia na miejsce dla wielu punktów orientacyjnych, korzystając z metody getTimeAndDistanceList().

Otrzymywanie aktualizacji trasy

Zadzwoń pod numer Navigator.addRouteChangedListener(), aby zarejestrować się i otrzymać powiadomienie, gdy trasa się zmieni.

Gdy trasa się zmienia, Navigation SDK wywołuje wywołanie zwrotne onRouteChanged(). Możesz wywołać funkcje Navigator.getRouteSegments i Navigator.getCurrentRouteSegment(), aby znaleźć nową trasę.

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

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

Zadzwoń pod numer NavigationView.addOnNightModeChangedListener lub NavigationFragment.addOnNightModeChangedListener, aby zarejestrować się i otrzymać oddzwonienie, gdy tryb nocny się zmieni.

Poniższy przykład pokazuje, jak nasłuchiwać 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ć programowo. Więcej informacji znajdziesz w artykule Ustawianie trybu nocnego.