האזנה לאירועי ניווט

האפליקציה יכולה להאזין לאירועים שמתרחשים בזמן שהמשתמש מנווט במסלול.

סקירה

אפשר להשתמש בממשקים הבאים כדי להאזין לאירועי ניווט:

  • הפונקציה Navigator.ArrivalListener מספקת את הקריאה החוזרת (callback) של onArrival(), שמופעלת כשהמכשיר מגיע ליעד.
  • RoadSnappedLocationProvider.LocationListener מספקת את הקריאה החוזרת (callback) של onLocationChanged(), שמופעלת כשמיקום המכשיר משתנה.
  • Navigator.RemainingTimeOrDistanceChangedListener מספק את הקריאה החוזרת (callback) של onRemainingTimeOrDistanceChanged(), שמופעלת כשהזמן או המרחק ליעד הבא משתנים ביותר מסכום נתון.
  • Navigator.RouteChangedListener מספקת את הקריאה החוזרת (callback) של onRouteChanged(), שמופעלת כשהמסלול משתנה.

להצגת הקוד

זיהוי הגעה ליעד

כאן, יעד מתייחס ליעד סופי או לציון דרך. כדי לזהות את ההגעה, קוראים לפונקציה Navigator.addArrivalListener(), שמתעדת קריאה חוזרת כשהמכשיר מגיע ליעד.

עם ההגעה, ערכת ה-SDK לניווט ל-Android מפעילה את הקריאה החוזרת ל-onArrival() ומפסיקה את ההנחיות המפורטות. עליכם לקרוא ל-Navigator.continueToNextDestination() באופן מפורש כדי להתקדם לנקודת הציון הבאה, ול-Navigator.startGuidance() כדי להמשיך בניווט המפורט.

כשקוראים לפונקציה continueToNextDestination(), הניווט מוחקת את כל המידע לגבי היעד הקודם. אם רוצים לנתח מידע על מקטע המסלול הקודם, חייבים לאחזר את המידע מניווט לפני קריאה ל-continueToNextDestination().

כדי למנוע דליפות זיכרון, עליכם להפעיל את removeArrivalListener(listener) כשאין לכם יותר צורך במאזינים.

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

קבלת עדכוני מיקום

מקבלים RoadSnappedLocationProvider מ-NavigationApi ואז קוראים ל-RoadSnappedLocationProvider.addLocationListener() כדי להירשם להתקשרות חזרה במקרה שמיקום המכשיר או הכותרת שלו משתנים. שימו לב שהמיקום הזה מוצמד לכביש, ולכן הוא עשוי להיות שונה מהמיקום שספק המיקום המשולב מחזיר בממשקי ה-API של המיקום של Google Play Services.

ה-Navigation SDK מספק עדכוני מיקום בתדירות הגבוהה ביותר האפשרית. כשיש עדכון מיקום, ה-Navigation SDK מפעיל את הקריאה החוזרת (callback) של onLocationChanged().

עדכוני מיקומים שנתמכים על ידי כבישים לא תלויים בניווט, והם יכולים להמשיך לפעול גם אחרי שהניווט נעצר. הרשמה לעדכוני מיקום עלולה לגרום להתרוקנות הסוללה, לדליפת זיכרון או לאיסוף לא מכוון של נתוני מיקום המכשיר, אם משאירים את עדכוני המיקום פועלים ברקע. קוראים ל-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);
}

קבלת עדכונים לגבי זמן ומרחק

קוראים לפונקציה Navigator.addRemainingTimeOrDistanceChangedListener() כדי להירשם לקריאה חוזרת (callback) כשהזמן שנותר (בשניות) או המרחק (במטרים) משתנה ביותר מסף נתון.

כשהשינוי בזמן או במרחק יחרוג מהסכום שצוין, ה-Navigation SDK מפעיל את הקריאה החוזרת (callback) של onRemainingTimeOrDistanceChanged().

כדי לחפש את הזמן שנותר ואת המרחק שנותר, צריך להתקשר למספר Navigator.getTimeAndDistanceList(). שימו לב שהזמנים והמרחקים ברשימה הם מצטברים: הם מציגים את הזמן והמרחק מהמיקום הנוכחי לכל ציון דרך, ולא בין נקודות ציון. האובייקט TimeAndDistance מחזיר עכשיו גם את delaySeverity. הערך של enum יהיה כבד, בינוני, קל או לא ידוע. זה תואם לצבע שמוצג ב-eta בממשק המשתמש של המפות (כבד = אדום, בינוני = צהוב, בהיר = ירוק). האפשרות הזו שימושית אם אתם צריכים ליצור כותרת תחתונה משלכם.

כדי למנוע דליפות זיכרון, עליכם להפעיל את Navigator.removeRemainingTimeOrDistanceChangedListener(listener) כשכבר לא צריכים את המאזינים.

בדוגמה הבאה נשלחת בקשה לקריאה חוזרת (callback) אם הזמן שנותר משתנה ביותר מ-60 שניות או שהמרחק שנותר משתנה ביותר מ-100 מטרים.

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

אפשר להציג את המידע על הזמן והמרחק שנותר באמצעות המסך המובנה באמצעות השיטה setEtaCardEnabled() ולהעביר פרמטר עם הערך TRUE. כדי להשמיט את תצוגת הזמן/המרחק, צריך להגדיר את הערך הזה ל-FALSE.

אתם יכולים לחשוף את זמן ההגעה המשוער לכמה ציוני דרך באמצעות השיטה getTimeAndDistanceList().

קבלת עדכונים לגבי המסלול

אפשר להתקשר למספר Navigator.addRouteChangedListener() כדי להירשם לקריאה חוזרת כשהמסלול משתנה.

כשהמסלול משתנה, ה-Navigation SDK מפעיל את הקריאה החוזרת (callback) של onRouteChanged(). אתם יכולים לבצע קריאה ל-Navigator.getRouteSegments ול-Navigator.getCurrentRouteSegment() כדי למצוא את המסלול החדש.

כדי למנוע דליפות זיכרון, עליכם להפעיל את removeRouteChangedListener(listener) כשאין לכם יותר צורך במאזינים.

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

זיהוי שינויים במצב לילה

אפשר להתקשר למספר NavigationView.addOnNightModeChangedListener או SupportNavigationFragment.addOnNightModeChangedListener כדי להירשם לשיחה חוזרת כשמצב לילה משתנה.

בדוגמה הבאה ניתן לראות שינויים במצב לילה במקטע ניווט.

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