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

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

סקירה כללית

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

להצגת הקוד

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

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

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

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

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

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

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

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

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

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

כדי למנוע דליפות זיכרון, עליכם להתקשר ל-removeRouteChangedListener(listener) כשכבר אין לכם צורך ב-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);
    }
});