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

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

סקירה כללית

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

הצגת הקוד

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

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

עם ההגעה ליעד, Navigation SDK ל-Android מפעיל את פונקציית ה-call back‏ 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 מספק עדכוני מיקום בתדירות גבוהה ככל האפשר. כשיש עדכון מיקום זמין, ה-SDK של הניווט מפעיל את פונקציית ה-call back‏ 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,‏ meduim,‏ 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 מפעיל את פונקציית ה-call back‏ 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);
    }
});

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