Tuyến đường đến một điểm đến duy nhất

Hãy làm theo hướng dẫn này để vẽ biểu đồ một tuyến trong ứng dụng tới một đích đến duy nhất bằng cách sử dụng SDK Điều hướng cho Android.

Tổng quan

  1. Tích hợp SDK Điều hướng vào ứng dụng của bạn, như mô tả trong hướng dẫn cấu hình.
  2. Thêm NavigationFragment hoặc NavigationView vào ứng dụng. Thành phần trên giao diện người dùng này sẽ thêm bản đồ tương tác và giao diện người dùng chỉ đường từng chặng vào hoạt động của bạn.
  3. Dùng lớp NavigationApi để khởi chạy SDK.
  4. Xác định Navigator để điều khiển tính năng chỉ đường theo từng chặng:

    • Thêm một đích đến bằng cách sử dụ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, để kiểm thử, gỡ lỗi và minh hoạ ứng dụng.
  5. Tạo bản dựng và chạy ứng dụng của bạn.

Xem mã

Thêm mảnh điều hướng

NavigationFragment là thành phần giao diện người dùng hiển thị kết quả điều hướng ở dạng hình ảnh, bao gồm cả bản đồ tương tác và đường đi 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.NavigationFragment"
    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.

Đối với các ứng dụng sử dụng phiên bản hỗ trợ của Fragment, SDK Điều hướng sẽ cung cấp khả năng tương thích thông qua SupportNavigationFragment. Phân mảnh này hoạt động theo cách tượng trưng cho NavigationFragment và bạn có thể quản lý phân mảnh theo phương thức lập trình bằng FragmentActivity.getSupportFragmentManager().

Thay thế cho một mảnh, thành phần giao diện người dùng cũng có sẵn dưới dạng NavigationView. Hãy lưu ý thông tin ở đầu phần mô tả về lớp, đặc biệt là về yêu cầu chuyển tiếp các phương thức trong vòng đời.

Yêu cầu cấp quyền 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ị.

Hướng dẫn này cung cấp mã cần thiết để 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ề các quyền trên Android.

  1. Thêm quyền làm phần tử con của phần tử <manifest> trong tệp kê khai 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. 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 cho phép hoặc từ chối cấp quyền truy cập thông tin vị trí. Mã sau đây sẽ kiểm tra xem liệu người dùng đã cấp quyền truy cập thông tin vị trí chính xác hay chưa. Nếu không, ứng dụng sẽ yêu cầu cấp 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 cấp 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 và định cấu hình hành trình

Lớp NavigationApi cung cấp logic khởi chạy cho phép ứng dụng của bạn sử dụng thành phần điều hướng của Google. Lớp Navigator cung cấp quyền kiểm soát việc định cấu hình và bắt đầu/dừng hành trình điều hướng.

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

  2. (Không bắt buộc) Đặt chữ số cuối cùng của biển số xe để bật quy định hạn chế về đường bộ ở các quốc gia được hỗ trợ (hiện là Brazil và Indonesia). Nếu lệnh gọi này được sử dụng cho bất kỳ mã quốc gia nào khác, thì API sẽ bỏ qua lệnh gọi đó. Bạn chỉ cần thực hiện lệnh gọi này một lần. Các yêu cầu chỉ đường tiếp theo sẽ tiếp tục sử dụng nó.

    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);
    
                    // Set the last digit of the car's license plate to get route restrictions
                    // in supported countries. (optional)
                    // 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);
                    }
                }
            });
    
  3. Sử dụng Navigator thu được ở trên, đặt đích đến Waypoint cho hành trình này. Sau khi tính toán thông tin đường đi, NavigationFragment sẽ hiển thị một hình nhiều đường biểu thị tuyến đường trên bản đồ và một điểm đánh dấu tại điểm đến.

    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 instructions để bật tuỳ chọn cho nhà phát triển trên thiết bị Android và định cấu hình hệ thống để phát hiện thiết bị. (Ngoài ra, bạn có thể sử dụng Trình quản lý thiết bị ảo Android (AVD) để định cấu hình một thiết bị ảo. Khi chọn một trình mô phỏng, hãy nhớ chọn một 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ị như được nhắc.

Gợi ý giúp 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 khi có thể sử dụng tính năng chỉ đường. Bạn chỉ cần chấp nhận một lần. 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 được 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ụ ở giai đoạn đầu trong quy trình trải nghiệm người dùng của ứng dụng, chẳng hạn như trong quá trình đăng ký hoặc đăng nhập, bằng cách sử dụng showTermsAndConditionsDialog().
  • Chất lượng điều hướng và độ chính xác của ETA được cải thiện đáng kể nếu bạn sử dụng mã địa điểm để khởi tạo điểm tham chiếu thay vì điểm đến theo vĩ độ/kinh độ.
  • Mẫu này lấy điểm tham chiếu đích từ một mã địa điểm cụ thể (dành cho Nhà hát Opera Sydney). Bạn có thể sử dụng công cụ tìm mã địa điểm để lấy mã địa điểm cho các vị trí cụ thể khác. Ngoài ra, bạn có thể cung cấp cho người dùng cơ hội chọn một điểm đến bằng cách thêm bộ chọn địa điểm vào ứng dụng của bạn. Để dùng thử một mẫu hoạt động của công cụ chọn địa điểm bằng SDK Điều hướng, hãy xem ứng dụng minh hoạ được mô tả trong phần giới thiệu.

Bước tiếp theo

Tìm hiểu cách di chuyển đến nhiều điểm đến trong một hành trình. Nếu hợp đồng của bạn với Google chỉ định phương thức thanh toán cho mỗi giao dịch, hãy thiết lập các giao dịch có thể tính phí.