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

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

סקירה כללית

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

הצגת הקוד

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

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

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

כשמתקשרים אל 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() כדי להירשם לקבלת שיחה חוזרת כשהזמן שנותר (בשניות) או המרחק (במטרים) משתנים ביותר מסף נתון.

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

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

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

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

אפשר גם להגדיר את מצב הלילה באופן פרוגרמטי. מידע נוסף זמין במאמר בנושא הגדרת מצב לילה.