ניווט במסלול עם יעד אחד

אפשר להיעזר במדריך הזה כדי לשרטט מסלול בתוך האפליקציה באמצעות SDK ניווט ל-Android. המדריך הזה מניח שכבר שילבתם את SDK לניווט באפליקציה, כפי שמתואר ב מגדירים את הפרויקט.

סיכום

  1. להוסיף רכיב בממשק המשתמש לאפליקציה, בתור מקטע ניווט או תצוגת ניווט. הרכיב הזה בממשק המשתמש מוסיף את המפה האינטראקטיבית ואת המסלול המפורט ניווט לפעילות שלך.
  2. מבקשים הרשאות מיקום. האפליקציה צריכה לבקש הרשאת מיקום כדי לקבוע את מיקום המכשיר.
  3. מפעילים את ה-SDK באמצעות NavigationApi בכיתה.
  4. אפשר להגדיר יעד ולשלוט בניווט מסלול מפורט באמצעות Navigator בכיתה. התהליך הזה כולל שלושה שלבים:

    • הגדרת יעד באמצעות setDestination()
    • התחלת הניווט עם startGuidance()
    • שימוש ב-getSimulator() כדי לדמות את התקדמות הרכב במסלול, לבדיקה, לניפוי באגים ולהדגמה של האפליקציה.
  5. יצירה והפעלה של האפליקציה.

להצגת הקוד

הוספת רכיב של ממשק משתמש לאפליקציה

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

SupportNavigationFragment הוא רכיב ממשק המשתמש שמציג את הפלט החזותי של הניווט, כולל מפה אינטראקטיבית ומסלול מפורט. אפשר להצהיר על המקטע בתוך את קובץ פריסת ה-XML כפי שמוצג כאן:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
    android:id="@+id/navigation_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

לחלופין, אפשר ליצור את המקטע באופן פרוגרמטי, כפי שמתואר ב- במסמכי התיעוד של Android, באמצעות FragmentActivity.getSupportFragmentManager().

כחלופה למקטע, רכיב ממשק המשתמש להצגת מפה זמין גם בתור NavigationView

שליחת בקשה להרשאת מיקום

בקטע הזה מוסבר איך לבקש הרשאת מיקום מדויק. לקבלת פרטים נוספים, אפשר לעיין במדריך עבור הרשאות ב-Android.

  1. הוספת ההרשאה כצאצא של הרכיב <manifest> ב-Android מניפסט:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.navsdksingledestination">
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    </manifest>
    
  2. לבקש הרשאות בתחילת ההפעלה באפליקציה, כדי לתת למשתמש הזדמנות כדי להעניק או לדחות הרשאת מיקום. הקוד הבא בודק אם המשתמש העניק הרשאת מיקום מדויקת. אם לא, היא מבקשת את ההרשאה:

    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted = true;
    } else {
        ActivityCompat.requestPermissions(this,
                new String[] { android.Manifest.permission.ACCESS_FINE_LOCATION },
                PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
    }
    
    if (!mLocationPermissionGranted) {
        displayMessage("Error loading Navigation SDK: "
                + "The user has not granted location permission.");
        return;
    }
    
  3. ביטול הקריאה החוזרת של onRequestPermissionsResult() כדי לטפל בתוצאה של בקשת ההרשאה:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        mLocationPermissionGranted = false;
        switch (requestCode) {
            case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is canceled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLocationPermissionGranted = true;
                }
            }
        }
    }
    

אתחול ה-SDK לניווט

NavigationApi המחלקה מספקת לוגיקת אתחול שמאשרת לאפליקציה שלך להשתמש ב-Google ניווט. בקטע הזה מתואר איך לאתחל את כלי הניווט, ועוד הגדרות אישיות נוספות שאפשר להפעיל באפליקציה:

  1. מפעילים את Navigation SDK ומבטלים את onNavigatorReady() קריאה חוזרת (callback) כדי להתחיל בניווט כשהניווט מוכן.

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

  3. זה שינוי אופציונלי. הפעלת הגבלות בכבישים במדינות נתמכות. קביעת האחרון של לוחית הרישוי. את השיחה הזו צריך לבצע רק פעם אחת: בקשות לקבלת מסלול ימשיכו להשתמש בו. השיחה הזו פועלת רק במכשירים נתמכים באזורים שונים. צפייה מדינות נתמכות ב-Navigation SDK.

    NavigationApi.getNavigator(this, new NavigationApi.NavigatorListener() {
                /**
                 * Sets up the navigation UI when the navigator is ready for use.
                 */
                @Override
                public void onNavigatorReady(Navigator navigator) {
                    displayMessage("Navigator ready.");
                    mNavigator = navigator;
                    mNavFragment = (NavigationFragment) getFragmentManager()
                            .findFragmentById(R.id.navigation_fragment);
    
                    // Optional. Disable the guidance notifications and shut down the app
                    // and background service when the user closes the app.
                    // mNavigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
    
                    // Optional. Set the last digit of the car's license plate to get
                    // route restrictions for supported countries.
                    // mNavigator.setLicensePlateRestrictionInfo(getLastDigit(), "BZ");
    
                    // Set the camera to follow the device location with 'TILTED' driving view.
                    mNavFragment.getCamera().followMyLocation(Camera.Perspective.TILTED);
    
                    // Set the travel mode (DRIVING, WALKING, CYCLING, TWO_WHEELER, or TAXI).
                    mRoutingOptions = new RoutingOptions();
                    mRoutingOptions.travelMode(RoutingOptions.TravelMode.DRIVING);
    
                    // Navigate to a place, specified by Place ID.
                    navigateToPlace(SYDNEY_OPERA_HOUSE, mRoutingOptions);
                }
    
                /**
                 * Handles errors from the Navigation SDK.
                 * @param errorCode The error code returned by the navigator.
                 */
                @Override
                public void onError(@NavigationApi.ErrorCode int errorCode) {
                    switch (errorCode) {
                        case NavigationApi.ErrorCode.NOT_AUTHORIZED:
                            displayMessage("Error loading Navigation SDK: Your API key is "
                                    + "invalid or not authorized to use the Navigation SDK.");
                            break;
                        case NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED:
                            displayMessage("Error loading Navigation SDK: User did not accept "
                                    + "the Navigation Terms of Use.");
                            break;
                        case NavigationApi.ErrorCode.NETWORK_ERROR:
                            displayMessage("Error loading Navigation SDK: Network error.");
                            break;
                        case NavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING:
                            displayMessage("Error loading Navigation SDK: Location permission "
                                    + "is missing.");
                            break;
                        default:
                            displayMessage("Error loading Navigation SDK: " + errorCode);
                    }
                }
            });
    

הגדרת יעד

Navigator הכיתה מספקת שליטה בהגדרה, הפעלה ועצירה של ניווט למסע.

באמצעות Navigator שקיבלתם בקטע הקודם, מגדירים יעד Waypoint למסע הזה. לאחר חישוב המסלולים, SupportNavigationFragment מציגה קו פוליגוני שמייצג את הנתיב במפה, וסַמָּן היעד.

    private void navigateToPlace(String placeId, RoutingOptions travelMode) {
        Waypoint destination;
        try {
            destination = Waypoint.builder().setPlaceIdString(placeId).build();
        } catch (Waypoint.UnsupportedPlaceIdException e) {
            displayMessage("Error starting navigation: Place ID is not supported.");
            return;
        }

        // Create a future to await the result of the asynchronous navigator task.
        ListenableResultFuture<Navigator.RouteStatus> pendingRoute =
                mNavigator.setDestination(destination, travelMode);

        // Define the action to perform when the SDK has determined the route.
        pendingRoute.setOnResultListener(
                new ListenableResultFuture.OnResultListener<Navigator.RouteStatus>() {
                    @Override
                    public void onResult(Navigator.RouteStatus code) {
                        switch (code) {
                            case OK:
                                // Hide the toolbar to maximize the navigation UI.
                                if (getActionBar() != null) {
                                    getActionBar().hide();
                                }

                                // Enable voice audio guidance (through the device speaker).
                                mNavigator.setAudioGuidance(
                                        Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE);

                                // Simulate vehicle progress along the route for demo/debug builds.
                                if (BuildConfig.DEBUG) {
                                    mNavigator.getSimulator().simulateLocationsAlongExistingRoute(
                                            new SimulationOptions().speedMultiplier(5));
                                }

                                // Start turn-by-turn guidance along the current route.
                                mNavigator.startGuidance();
                                break;
                            // Handle error conditions returned by the navigator.
                            case NO_ROUTE_FOUND:
                                displayMessage("Error starting navigation: No route found.");
                                break;
                            case NETWORK_ERROR:
                                displayMessage("Error starting navigation: Network error.");
                                break;
                            case ROUTE_CANCELED:
                                displayMessage("Error starting navigation: Route canceled.");
                                break;
                            default:
                                displayMessage("Error starting navigation: "
                                        + String.valueOf(code));
                        }
                    }
                });
    }

יצירה והפעלה של אפליקציה

  1. מחברים מכשיר Android למחשב. מעקב אחר Android Studio הוראות להרצת אפליקציות במכשיר חומרה לחלופין, אפשר להגדיר מכשיר וירטואלי באמצעות ניהול מכשיר וירטואלי (AVD) של Android. כאשר בוחרים אמולטור, חשוב לבחור תמונה שכוללת ממשקי Google API.
  2. ב-Android Studio, לוחצים על אפשרות התפריט הפעלה או על סמל לחצן ההפעלה. בוחרים מכשיר בהתאם להנחיה.

טיפים לשיפור חוויית המשתמש

  • המשתמש חייב לאשר את התנאים וההגבלות של ניווט ב-Google לפני הניווט יהיה זמין. האישור הזה נדרש רק פעם אחת. על ידי כברירת מחדל, ה-SDK מבקש לאשר בפעם הראשונה שהניווט הופעלה. אם אתם מעדיפים, תוכלו להפעיל את תיבת הדו-שיח 'תנאים והגבלות של הניווט'. בשלב מוקדם של תהליך חוויית המשתמש באפליקציה, למשל במהלך ההרשמה או ההתחברות, TermsAndConditionsCheckOption
  • כדי לשפר משמעותית את איכות הניווט ואת הדיוק של זמן ההגעה המשוער, מומלץ להשתמש מזהי מקומות כדי לאתחל ציון דרך במקום קו אורך/רוחב של הקואורדינטות.
  • דוגמה זו מסיקה את ציון הדרך של היעד מתוך מזהה מקום ספציפי של בית האופרה של סידני. אפשר להשתמש חיפוש מזהי מקום כדי לקבל מזהים של מקומות ספציפיים אחרים.