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

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

סקירה כללית

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

הצגת הקוד

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

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

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