Hãy làm theo hướng dẫn này để lập kế hoạch cho 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 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 mình, như mô tả trong phần Thiết lập dự án.
Tóm tắt
- Thêm một phần tử trên giao diện người dùng vào ứng dụng của bạn, dưới dạng một mảnh điều hướng hoặc một thành phần hiển thị đ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à giao diện người dùng chỉ đường từng chặng vào Hoạt động của bạn.
- Yêu cầu quyền truy cập vị trí. Ứng dụng của bạn phải yêu cầu quyền truy cập vị trí để xác định vị trí của thiết bị.
- Khởi chạy SDK bằng lớp
NavigationApi. Đặt điểm đến và kiểm soát tính năng đường đi từng chặng bằng lớp
Navigator. Quá trình này bao gồm 3 bước:- Đặ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, nhằm mục đích kiểm thử, gỡ lỗi và minh hoạ ứng dụng của bạn.
- Đặt đích đến bằng cách sử dụng
Tạo và chạy ứng dụng của bạn.
Xem mã
Thêm một phần tử trên giao diện người dùng vào ứng dụng
Phần này trình bày hai cách để bạn có thể thêm bản đồ tương tác và giao diện người dùng để hiển thị thông tin đường đi từng chặng. Trong hầu hết các trường hợp, bạn nên sử dụng
NavigationFragment,
là một trình bao bọc cho
NavigationView,
thay vì tương tác trực tiếp với NavigationView. Để biết thêm thông tin, hãy xem phần Các phương pháp hay nhất về tương tác với bản đồ điều hướng
.
Sử dụng 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ả trực quan của tính năng chỉ đường, bao gồm cả
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.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 về Android, bằng cách sử dụng FragmentActivity.getSupportFragmentManager().
Sử dụng chế độ xem điều hướng
Ngoài mảnh, thành phần giao diện người dùng để hiển thị bản đồ cho tính năng chỉ đường cũng có sẵn 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 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.
Thêm quyền dưới dạng 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>Yêu cầu quyền khi bắt đầu chạy trong ứng dụng, cho phép người dùng cấp hoặc từ chối quyền truy cập vị trí. Đoạn mã sau đây kiểm tra xem người dùng đã cấp quyền truy cập vị trí chính xác hay chưa. Nếu chưa, đoạn mã 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; }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
Lớp NavigationApi cung cấp logic khởi chạy để cho phép ứng dụng của bạn sử dụng tính năng chỉ đường của Google. Phần này trình bày cách khởi động trình điều hướng, cùng với một số cấu hình khác mà bạn có thể bật cho ứng dụng của mình:
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 đã sẵn sàng.Không bắt buộc: Định cấu hình ứng dụng để thông báo hướng dẫn và dịch vụ nền tắt khi người dùng đóng ứng dụng khỏi thiết bị. Lựa chọn này phụ thuộc vào mô hình kinh doanh của bạn. Bạn nên sử dụng hành vi mặc định của trình điều hướng, tức là tiếp tục hiển thị thông tin hướng dẫn rẽ và thông báo cập nhật vị trí ngay cả khi ứng dụng bị đóng. Nếu muốn tắt tính năng đ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.
Không bắt buộc: Bật quy định hạn chế về đường ở các quốc gia được hỗ trợ. Đặt chữ số cuối cùng của biển số xe. 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 lệnh gọi này. Cuộc gọi này chỉ hoạt động ở các khu vực được hỗ trợ. Xem các quốc gia được SDK Điều hướng hỗ trợ.
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) getSupportFragmentManager() .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 đích đến
Lớp
Navigator
cung cấp quyền kiểm soát đối với việc định cấu hình, bắt đầu và dừng hành trình
đi theo chỉ dẫn.
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 đườ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.
```none
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).
AudioGuidanceSettings audioSettings =
AudioGuidanceSettings.builder()
.setGuidanceMode(
AudioGuidanceSettings.GuidanceMode
.VOICE_ALERTS_AND_GUIDANCE)
.build();
mNavigator.setAudioGuidanceSettings(audioSettings);
// 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;
case ROUTING_TIMEOUT:
displayMessage("Error starting navigation: Routing timed out.");
break;
default:
displayMessage("Error starting navigation: "
+ String.valueOf(code));
}
}
});
}
```
Định cấu hình hướng dẫn bằng âm thanh
Để điều chỉnh chế độ cài đặt hướng dẫn bằng âm thanh (bao gồm cả chế độ hướng dẫn và mức âm lượng), hãy truyền một đối tượng AudioGuidanceSettings đến trình điều hướng.
Hệ thống chỉ đường sử dụng chế độ cài đặt được lưu gần đây nhất hoặc mặc định là âm lượng bình thường và cảnh báo bằng giọng nói kèm theo hướng dẫn.
Ví dụ sau đây cho thấy cách định cấu hình trình điều hướng để sử dụng âm lượng nhỏ và bật cả cảnh báo bằng giọng nói và hướng dẫn từng chặng:
// Configure audio guidance settings.
AudioGuidanceSettings audioSettings = AudioGuidanceSettings.builder()
.setGuidanceMode(AudioGuidanceSettings.GuidanceMode.VOICE_ALERTS_AND_GUIDANCE)
.setVolumeLevel(AudioGuidanceSettings.VolumeLevel.LOW)
.build();
mNavigator.setAudioGuidanceSettings(audioSettings);
Tạo và chạy ứng dụng
- Kết nối thiết bị Android với máy tính. Làm theo hướng dẫn của Android Studio 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 thiết bị ảo bằng Trình quản lý thiết bị Android ảo (AVD). Khi chọn trình mô phỏng, hãy nhớ chọn một hình ảnh có chứa API của Google.
- Trong Android Studio, hãy nhấp vào tuỳ chọn trình đơn Run (Chạy) hoặc Run (Chạy). Chọn một thiết bị theo lời 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 Điều hướng trước khi có thể sử dụng tính năng điều hướng. Bạn chỉ cần chấp nhận một lần. Theo mặc định, SDK sẽ nhắc người dùng chấp nhận trong 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ụ của tính năng chỉ đường ở 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
TermsAndConditionsCheckOption. - Để cải thiện đáng kể chất lượng đi theo chỉ dẫn và độ chính xác của thời gian đến dự kiến, hãy sử dụng mã địa điểm để khởi động một điểm tham chiếu thay vì toạ độ vĩ độ/kinh độ.
- 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ã địa điểm để lấy mã địa điểm cho các vị trí cụ thể khác.