Tìm đường đi bằng một điểm đến

Hãy làm theo hướng dẫn này để vẽ một tuyến đường trong ứng dụng của bạn bằng cách sử dụng SDK điều hướng dành cho Android. Hướng dẫn này giả định rằng bạn đã tích hợp SDK điều hướng vào ứng dụng của bạn, như mô tả trong Thiết lập dự án.

Tóm tắt

  1. Thêm thành phần trên giao diện người dùng vào ứng dụng, có thể là mảnh điều hướng hoặc mảnh chế độ xem điều hướng. Phần tử trên giao diện người dùng này thêm bản đồ tương tác và từng chặng giao diện người dùng điều hướng đến hoạt động của bạn.
  2. Yêu cầu quyền truy cập thông tin vị trí. Ứng dụng của bạn phải yêu cầu quyền truy cập thông tin vị trí để xác định vị trí của thiết bị.
  3. Khởi chạy SDK bằng cách sử dụng NavigationApi .
  4. Đặt một điểm đến và kiểm soát điều hướng từng chặng bằng cách sử dụng Navigator . Quá trình này bao gồm 3 bước:

    • Đặt điểm đến bằng setDestination().
    • Bắt đầu đi theo chỉ dẫn bằng startGuidance().
    • Sử dụng getSimulator() để mô phỏng tiến trình của xe dọc theo tuyến đường, để thử nghiệm, gỡ lỗi và thể hiện ứng dụng của bạn.
  5. Tạo bản dựng và chạy ứng dụng của bạn.

Xem mã

Thêm thành phần trên giao diện người dùng vào ứng dụng

Phần này đề cập đến hai cách mà bạn có thể thêm bản đồ và giao diện người dùng tương tác cho hiển thị đường đi từng chặng.

SupportNavigationFragment là thành phần giao diện người dùng hiển thị đầu ra hình ảnh điều hướng, bao gồm bản đồ tương tác và chỉ đường từng chặng. Bạn có thể khai báo mảnh trong tệp bố cục XML như minh hoạ dưới đây:

<?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"/>

Ngoài ra, bạn có thể tạo mảnh theo phương thức lập trình, như mô tả trong tài liệu Android, sử dụng FragmentActivity.getSupportFragmentManager().

Thay vì một mảnh, thành phần giao diện người dùng để hiển thị bản đồ điều hướng cũng hoạt động dưới dạng NavigationView.

Yêu cầu cấp quyền vị trí

Phần này minh hoạ cách yêu cầu quyền truy cập thông tin vị trí chính xác. Để biết thêm thông tin, hãy xem hướng dẫn về Quyền trên Android.

  1. Thêm quyền này ở dạng phần tử con của phần tử <manifest> trong thiết bị Android tệp kê khai:

    <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. Yêu cầu quyền khi bắt đầu chạy trong ứng dụng của bạn, để người dùng có cơ hội để cấp hoặc từ chối quyền truy cập thông tin vị trí. Mã sau đây kiểm tra xem người dùng đã cấp quyền truy cập thông tin vị trí chính xác. Nếu không, ứng dụng sẽ yêu cầu quyền:

    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. Ghi đè lệnh gọi lại onRequestPermissionsResult() để xử lý kết quả của yêu cầu quyền:

    @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;
                }
            }
        }
    }
    

Khởi chạy SDK điều hướng

Chiến lược phát hành đĩa đơn NavigationApi lớp cung cấp logic khởi tạo cho phép ứng dụng của bạn sử dụng Google điều hướng. Phần này bao gồm cách khởi chạy trình điều hướng, cùng với một số các cấu hình khác mà bạn có thể bật cho ứng dụng của mình:

  1. Khởi chạy SDK điều hướng và ghi đè Lệnh gọi lại onNavigatorReady() để bắt đầu điều hướng khi trình điều hướng được sẵn sàng.

  2. Không bắt buộc. Định cấu hình ứng dụng để thông báo hướng dẫn và chế độ nền tắt khi người dùng đóng ứng dụng khỏi thiết bị của họ. Chiến dịch này lựa chọn phụ thuộc vào mô hình kinh doanh của bạn. Bạn có thể muốn sử dụng tuỳ chọn mặc định hành vi của trình điều hướng, tiếp tục hiển thị hướng dẫn và vị trí rẽ cập nhật ngay cả khi ứng dụng bị đóng. Nếu thay vào đó, bạn muốn tắt điều hướng và cập nhật vị trí khi người dùng cuối đóng ứng dụng, bạn sẽ sử dụng cấu hình này.

  3. Không bắt buộc. Bật hạn chế đường ở các quốc gia được hỗ trợ. Đặt thời gian cuối chữ số của biển số xe. Lệnh gọi này chỉ cần được thực hiện một lần: tiếp theo các yêu cầu chỉ đường sẽ tiếp tục sử dụng nó. Cuộc gọi này chỉ hoạt động trên các thiết bị được hỗ trợ của Google. Xem Các quốc gia hỗ trợ SDK điều hướng.

    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);
                    }
                }
            });
    

Đặt điểm đến

Chiến lược phát hành đĩa đơn Navigator lớp cung cấp khả năng kiểm soát việc định cấu hình, bắt đầu và dừng điều hướng hành trình.

Sử dụng Navigator thu được trong phần trước, hãy đặt đích đến Waypoint cho hành trình này. Sau khi tính toán chỉ đường, SupportNavigationFragment hiển thị một hình nhiều đường thể hiện tuyến đường trên bản đồ và một điểm đánh dấu tại đích.

    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));
                        }
                    }
                });
    }

Tạo và chạy ứng dụng

  1. Kết nối thiết bị Android với máy tính. Làm theo Android Studio hướng dẫn về cách Chạy ứng dụng trên thiết bị phần cứng Ngoài ra, bạn có thể định cấu hình một thiết bị ảo bằng Trình quản lý thiết bị Android ảo (AVD). Khi chọn một trình mô phỏng, hãy nhớ chọn hình ảnh có chứa các API của Google.
  2. Trong Android Studio, hãy nhấp vào tuỳ chọn trình đơn Run (Chạy) hoặc biểu tượng nút phát. Chọn một thiết bị khi được nhắc.

Gợi ý để cải thiện trải nghiệm người dùng

  • Người dùng phải chấp nhận Điều khoản dịch vụ của Google Navigation trước điều hướng sẽ khả dụng. Bạn chỉ phải chấp nhận một lần. Theo theo mặc định, SDK sẽ nhắc chấp nhận vào lần đầu tiên trình điều hướng đã gọi. Nếu muốn, bạn có thể kích hoạt hộp thoại Điều khoản dịch vụ điều hướng tại thời điểm đầu trong luồng trải nghiệm người dùng của ứng dụng, chẳng hạn như trong khi đăng ký hoặc đăng nhập, sử dụng TermsAndConditionsCheckOption.
  • Để cải thiện đáng kể chất lượng chỉ đường và độ chính xác của giờ đến dự kiến, hãy sử dụng mã địa điểm để khởi tạo một điểm tham chiếu thay vì vĩ độ/kinh độ toạ độ.
  • Mẫu này lấy điểm tham chiếu đích từ một mã địa điểm cụ thể cho Nhà hát Opera Sydney. Bạn có thể sử dụng trình tìm mã nhận dạng vị trí để lấy mã địa điểm cho các vị trí cụ thể khác.