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

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

סקירה כללית

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

הצגת הקוד

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

במקרה הזה, יעד מתייחס ליעד סופי או לנקודת ביניים. כדי לזהות הגעה, מתקשרים אל 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 מספק עדכוני מיקום בתדירות הגבוהה ביותר האפשרית. כשעדכון לגבי מיקום זמין, ה-SDK של Navigation מפעיל את הקריאה החוזרת (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. הערכים האפשריים של הטיפוס הזה הם HEAVY, ‏MEDIUM, ‏LIGHT או UNKNOWN. הצבע הזה תואם לצבע שמוצג בממשק המשתמש של מפות Google לגבי זמן ההגעה המשוער (כבד = אדום, בינוני = צהוב, קל = ירוק). המידע הזה שימושי אם אתם צריכים ליצור כותרת תחתונה משלכם עם זמן הגעה משוער.

כדי למנוע דליפות זיכרון, צריך להפעיל את Navigator.removeRemainingTimeOrDistanceChangedListener(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 או אל NavigationFragment.addOnNightModeChangedListener כדי להירשם לקבלת שיחה חוזרת כשמצב הלילה משתנה.

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

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

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