1. Trước khi bắt đầu
Lớp học lập trình này hướng dẫn bạn tạo một ứng dụng Android đơn giản sử dụng Navigation SDK của Google Maps Platform để điều hướng đến một đích đến được định cấu hình sẵn.
Đây là giao diện của ứng dụng khi bạn hoàn tất.

Điều kiện tiên quyết
- Có kiến thức cơ bản về phát triển ứng dụng Android bằng Kotlin
- Có kiến thức cơ bản về các khái niệm cơ bản của Google Maps SDK, chẳng hạn như bản đồ, vị trí, toạ độ.
Kiến thức bạn sẽ học được
- Cách tạo một ứng dụng Android đơn giản sử dụng Navigation SDK để điều hướng đến một đích đến.
- Cách tích hợp Navigation SDK từ kho lưu trữ Google Maven từ xa
- Cách quản lý quyền truy cập vào vị trí và thoả thuận của người dùng theo các điều khoản dành cho người dùng cuối của Navigation SDK
- Cách khởi chạy SDK
- Cách đặt điểm đến và bắt đầu đi theo chỉ dẫn.
Bạn cần có
- Đã cài đặt phiên bản ổn định mới nhất của Android Studio. Lớp học lập trình này được tạo bằng Android Studio Jellyfish. Nếu bạn đang sử dụng một phiên bản khác, thì giao diện và bố cục của giao diện người dùng và các thành phần có thể khác.
- Một Tài khoản Google và Dự án có bật tính năng thanh toán.
- Một thiết bị Android ở Chế độ nhà phát triển đã bật tính năng gỡ lỗi qua USB hoặc một trình mô phỏng Android. Dù bạn chọn cách nào, cách đó cũng phải đáp ứng các yêu cầu tối thiểu đối với Navigation SDK
2. Bắt đầu thiết lập
Nếu bạn chưa có tài khoản Google Cloud Platform và dự án trên đám mây đã bật tính năng thanh toán, hãy thiết lập dự án trên Google Cloud theo hướng dẫn Bắt đầu sử dụng Google Maps Platform https://developers.google.com/maps/gmp-get-started
Chọn dự án trên Google Cloud trong bảng điều khiển
Trong Cloud Console, hãy nhấp vào trình đơn thả xuống dự án rồi chọn dự án mà bạn muốn sử dụng cho lớp học lập trình này.

Bật Navigation SDK trong dự án của bạn
Bật các API và SDK của Google Maps Platform cần thiết cho lớp học lập trình này trong Google Cloud Marketplace.
Chuyển đến phần API và dịch vụ > Thư viện trong Google Cloud Console rồi tìm "Navigation SDK".
Bạn sẽ thấy một kết quả tìm kiếm.

Nhấp vào kết quả Navigation SDK để mở trang thông tin chi tiết sản phẩm. Nhấp vào nút Bật để bật SDK trên dự án của bạn.
Lặp lại quy trình này cho Google Maps SDK cho Android.
Tạo khoá API
Tạo khoá API trên trang Thông tin xác thực của Cloud Console. Bạn có thể làm theo các bước trong bước 3 của phần bắt đầu nhanh trong bài viết Bắt đầu sử dụng Google Maps Platform. Tất cả yêu cầu đối với Google Maps Platform đều cần có khoá API.
3. Tải tệp dự án mẫu xuống
Phần này mô tả cách thiết lập một dự án Android Studio trống cơ bản bằng cách sao chép các tệp từ kho lưu trữ GitHub cho lớp học lập trình này. Kho lưu trữ Github chứa các phiên bản mã trước và sau của lớp học lập trình. Lớp học lập trình sẽ bắt đầu bằng một mẫu dự án trống và xây dựng cho đến trạng thái hoàn thành. Bạn có thể sử dụng dự án đã hoàn thành trong kho lưu trữ làm tài liệu tham khảo nếu gặp khó khăn.
Sao chép kho lưu trữ này trên GitHub để lấy mã cho lớp học lập trình này.
git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git
Nếu bạn chưa cài đặt git, hãy nhấp vào nút này để lấy mã:
Để bạn có thể bắt đầu nhanh chóng, kho lưu trữ này chứa một số mã khởi đầu trong thư mục Starter để giúp bạn theo dõi lớp học lập trình này. Dự án khởi đầu cung cấp giao diện người dùng ứng dụng cơ bản và cấu hình bản dựng nhưng chưa thêm Navigation SDK. Ngoài ra, còn có một dự án Solution đã hoàn thành trong trường hợp bạn muốn chuyển sang bước tiếp theo hoặc kiểm tra tiến trình của mình bất cứ lúc nào.
Mở kho lưu trữ đã sao chép trong Android Studio
Sau khi bạn sao chép kho lưu trữ xuống thiết bị, hãy dùng Android Studio để mở thư mục Starter dưới dạng một dự án hiện có.
- Trong hộp thoại Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy nhấp vào nút Open (Mở).
- Chuyển đến thư mục nơi bạn đã lưu kho lưu trữ được sao chép rồi chọn thư mục
Starterbên trong thư mục "codelab-navigation-101-android-kotlin" cấp cao nhất. - Kiểm tra để đảm bảo dự án được tạo và chạy.
Thêm thiết bị ảo hoặc kết nối thiết bị phần cứng
Để kết nối thiết bị Android với máy tính, hãy 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 một 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 các API của Google.
Trong Android Studio, hãy nhấp vào mục Run (Chạy) trong trình đơn hoặc biểu tượng nút phát. Chọn một thiết bị theo lời nhắc.
4. Thêm Navigation SDK vào ứng dụng của bạn
Thêm thư viện Navigation SDK và khoá API vào dự án
Để thêm thư viện Navigation SDK vào ứng dụng, bạn cần sửa đổi build.gradle.kts ở cấp ứng dụng để tìm nạp Navigation SDK từ kho lưu trữ Google Maven và định cấu hình số phiên bản.
Tạo một biến trong cấu hình bản dựng để lưu trữ số phiên bản Navigation SDK.
Thiết lập một biến trong build.gradle.kts ở cấp ứng dụng để chứa giá trị của phiên bản Navigation SDK được dùng trong ứng dụng, nhờ đó, bạn có thể dễ dàng thay đổi thành phiên bản mới nhất trong tương lai.
Hãy xem ghi chú phát hành Navigation SDK để biết số phiên bản mới nhất.
val navSdkVersion by extra("6.0.0")
Bạn cũng có thể sửa đổi giá trị của biến này và các biến khác bằng hộp thoại trong phần File > Project Structure > Variables (Tệp > Cấu trúc dự án > Biến):

Thêm một phần phụ thuộc vào cấu hình bản dựng
Bây giờ, hãy thêm phần phụ thuộc API sau vào khối phần phụ thuộc trong build.gradle.kts. ở cấp ứng dụng. Phiên bản được dùng sẽ là giá trị của ${navSdkVersion} mà bạn vừa đặt trong build.gradle.kts ở cấp ứng dụng:
dependencies {
// Include the Google Navigation SDK.
api("com.google.android.libraries.navigation:navigation:${navSdkVersion}")
...
Thêm khoá API
Sử dụng trình bổ trợ Secrets Gradle để quản lý khoá API
Bạn nên sử dụng trình bổ trợ Secrets Gradle để quản lý khoá API một cách an toàn trong ứng dụng. Trình bổ trợ này đã được thêm vào mẫu dự án ban đầu dưới dạng một phần phụ thuộc trong tệp build.gradle.kts cấp cao nhất.
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
//... other plugin definitions here
}
Mở tệp secrets.properties trong thư mục cấp cao nhất, rồi thay thế YOUR_API_KEY bằng khoá API của bạn. Lưu trữ khoá của bạn trong tệp này vì secrets.properties không được đưa vào hệ thống quản lý phiên bản.
MAPS_API_KEY=YOUR_API_KEY
Để biết thêm thông tin về chủ đề này, hãy xem phần Thêm khoá API vào ứng dụng trong tài liệu về Navigation SDK.
Xác minh nội dung của local.defaults.properties
Dự án trống cũng chứa một tệp local.defaults.properties trong thư mục cấp cao nhất, cùng thư mục với tệp secrets.properties. Mở tệp này và quan sát đoạn mã sau.
MAPS_API_KEY=DEFAULT_API_KEY
Điều này nhằm cung cấp giá trị dự phòng cho thuộc tính MAPS_API_KEY trong trường hợp secrets.properties không được thêm vào dự án, để các bản dựng không bị lỗi. Bạn không cần chỉnh sửa tệp này. Nếu không tìm thấy định nghĩa secrets.properties của MAPS_API_KEY, giá trị mặc định sẽ khiến ứng dụng ngừng chạy trong thời gian chạy, kèm theo lỗi khoá API.
Kiểm tra để đảm bảo Android Manifest đang dùng khoá API mà bạn đã chỉ định
Mở tệp app/src/main/AndroidManifest.xml. Bạn sẽ nhận thấy rằng thuộc tính MAPS_API_KEY được dùng để đặt khoá API cho ứng dụng:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
Mở tệp build.gradle.kts ở cấp ứng dụng rồi tìm thuộc tính secrets.
Bạn nên đặt chế độ cài đặt propertiesFileName của trình bổ trợ thành secrets.properties và defaultPropertiesFileName sẽ đọc local.defaults.properties.
secrets {
// Optionally specify a different file name containing your secrets.
// The plugin defaults to "local.properties"
propertiesFileName = "secrets.properties"
// A properties file containing default secret values. This file can be
// checked in version control.
defaultPropertiesFileName = "local.defaults.properties"
}
Lưu tất cả các tệp và đồng bộ hoá dự án của bạn với Gradle.
5. Định cấu hình quyền cho ứng dụng và thêm giao diện người dùng cơ bản
Yêu cầu cấp quyền truy cập thông tin vị trí chính xác
Navigation SDK phụ thuộc vào tín hiệu GPS để hoạt động, vì vậy, ứng dụng của bạn sẽ cần yêu cầu người dùng cấp quyền truy cập vào dữ liệu vị trí chính xác. Thêm quyền truy cập thông tin vị trí chính xác dưới dạng một phần tử con của phần tử <manifest> trong AndroidManifest.xml.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
/>
</manifest>
Bạn có thể đọc thêm về quyền truy cập thông tin vị trí trên Android trong phần Yêu cầu cấp quyền truy cập thông tin vị trí của tài liệu dành cho nhà phát triển Android.
Để chạy ứng dụng trên thiết bị Android 14, hãy yêu cầu quyền truy cập thông tin vị trí của Dịch vụ trên nền trước bằng cách thêm thẻ uses-permission sau đây ở cùng vị trí với quyền truy cập thông tin vị trí chính xác:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
Thêm một hoạt động khởi chạy bằng giao diện người dùng cơ bản
Khi chạy, ứng dụng của bạn sẽ cần mã thực thi trong quá trình khởi động để kiểm tra xem người dùng đã cấp quyền truy cập vào vị trí của họ hay chưa, đồng thời xử lý từng trường hợp có thể xảy ra, yêu cầu cấp quyền nếu người dùng chưa cấp. Để làm việc này, hãy thêm một giao diện người dùng cơ bản vào ứng dụng của bạn. Lớp học lập trình này sử dụng giao diện người dùng được tạo khi bạn tạo một hoạt động Views trống mới trong Android Studio. Bạn sẽ điều chỉnh mã này để thực hiện quy trình kiểm tra quyền truy cập thông tin vị trí trước khi thêm mã vào hoạt động cho giao diện người dùng điều hướng.
Mở tệp MainActivity.kt trong trình soạn thảo mã và kiểm tra mã. Mã này cho thấy một giao diện người dùng cơ bản.
Yêu cầu quyền truy cập thông tin vị trí trong thời gian chạy
Ứng dụng của bạn sẽ cần kích hoạt yêu cầu truy cập vào vị trí chính xác trước khi Navigation SDK được khởi chạy.
Để đảm bảo quy trình kiểm tra này diễn ra khi ứng dụng của bạn khởi động, hãy thêm một đoạn mã vào lớp MainActivity, trong phương thức onCreate() bị ghi đè của Activity.
Đoạn 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 hay chưa. Nếu chưa, ứng dụng sẽ yêu cầu cấp quyền. Thêm mã này vào bên trong phương thức onCreate().
val permissions =
if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
arrayOf(permission.ACCESS_FINE_LOCATION, permission.POST_NOTIFICATIONS)
} else {
arrayOf(permission.ACCESS_FINE_LOCATION)
}
if (permissions.any { !checkPermissionGranted(it) }) {
if (permissions.any { shouldShowRequestPermissionRationale(it) }) {
// Display a dialogue explaining the required permissions.
}
val permissionsLauncher =
registerForActivityResult(
RequestMultiplePermissions(),
{ permissionResults ->
if (permissionResults.getOrDefault(permission.ACCESS_FINE_LOCATION, false)) {
onLocationPermissionGranted()
} else {
finish()
}
},
)
permissionsLauncher.launch(permissions)
} else {
android.os.Handler(Looper.getMainLooper()).postDelayed({ onLocationPermissionGranted() }, SPLASH_SCREEN_DELAY_MILLIS)
}
}
private fun checkPermissionGranted(permissionToCheck: String): Boolean =
ContextCompat.checkSelfPermission(this, permissionToCheck) == PackageManager.PERMISSION_GRANTED
Thêm một hàm mới vào lớp MainActivity, có tên là onLocationPermissionGranted. Hàm này sẽ xử lý kết quả khi người dùng cấp quyền chia sẻ vị trí của họ. Trong các bước tiếp theo, chúng ta sẽ thêm mã vào đây để khởi chạy một hoạt động điều hướng mới.
private fun onLocationPermissionGranted() {
//code to initialize Navigation SDK will go here
}
Tạo dự án. Nếu bạn gặp lỗi khi tạo bản dựng, hãy tìm và khắc phục các lỗi đó.
Chạy dự án trên một thiết bị ảo mới. Bạn sẽ thấy hộp thoại yêu cầu cấp quyền xuất hiện khi ứng dụng cài đặt và khởi động.
6. Thêm giao diện người dùng điều hướng
Có hai cách để thêm giao diện người dùng điều hướng: SupportNavigationFragment hoặc NavigationView.
Để đơn giản hoá, lớp học lập trình này sử dụng NavigationView.
Chỉnh sửa bố cục
Chỉnh sửa res/layout/activity_main.xml để thêm bố cục cho NavigationView.
- Mở tệp rồi chuyển sang chế độ xem Mã.
- Thay thế toàn bộ nội dung của tệp bằng một bố cục mới của
NavigationViewbên trongRelativeLayoutnhư trong ví dụ bên dưới. Vì bạn chỉ cần thêm một khung hiển thị điều hướng vào ứng dụng, nên một bố cục đơn giản là đủ. - Đặt mã nhận dạng "
@+id/navigation_view" cho NavigationView.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.libraries.navigation.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
Thiết lập hoạt động Điều hướng
Trong Android Studio, hãy mở tệp MainActivity.kt trong trình chỉnh sửa.
Thêm một số mã thiết lập cơ bản để đảm bảo trải nghiệm điều hướng hoạt động chính xác trong ứng dụng của bạn. Trong tệp MainActivity.kt, hãy thực hiện các thay đổi sau:
- Khai báo một biến trong lớp
MainActivityđể tham chiếu đếnNavigationView:
private lateinit var navView: NavigationView
- Thêm một số mã vào phương thức
onCreate()để lấy thông tin tham chiếu đếnNavigationView:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
- Thêm một số mã vào phương thức
onCreate()để đảm bảo màn hình luôn bật trong quá trình hướng dẫn chỉ đường:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
- Chỉnh sửa mã gọi
ViewCompat.setOnApplyWindowInsetsListenerđể tham chiếu đến mã nhận dạng củaNavigationView.
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.navigation_view)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
- Thêm một phương thức
showToast()vào lớp để cho người dùng thấy ý kiến phản hồi:
private fun showToast(errorMessage: String) {
Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show()
}
7. Khởi chạy Navigation SDK
Giờ đây, sau khi hoàn tất quá trình thiết lập cơ bản cho hoạt động Điều hướng, bạn có thể khởi chạy Navigation SDK. Để làm việc này, hãy thêm mã sau vào tệp MainActivity.kt:
/** Starts the Navigation API, capturing a reference when ready. */
@SuppressLint("MissingPermission")
private fun initializeNavigationApi() {
NavigationApi.getNavigator(
this,
object : NavigatorListener {
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
// code to start guidance will go here
}
override fun onError(@NavigationApi.ErrorCode errorCode: Int) {
when (errorCode) {
NavigationApi.ErrorCode.NOT_AUTHORIZED -> {
// Note: If this message is displayed, you may need to check that
// your API_KEY is specified correctly in AndroidManifest.xml
// and is been enabled to access the Navigation API
showToast(
"Error loading Navigation API: Your API key is " +
"invalid or not authorized to use Navigation."
)
}
NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED -> {
showToast(
"Error loading Navigation API: User did not " +
"accept the Navigation Terms of Use."
)
}
else -> showToast("Error loading Navigation API: $errorCode")
}
}
},
)
}
Đoạn mã này tạo một phương thức mới có tên là initializeNavigationApi(). Phương thức này tham chiếu đến một đối tượng Navigator bằng cách gọi NavigationApi.getNavigator() và triển khai NavigatorListener để xử lý lệnh gọi lại.
Xin lưu ý rằng khi Navigation API được khởi chạy, phương thức NavigationListener.onNavigatorReady sẽ được gọi, với đối tượng Navigator được truyền dưới dạng tham số. Đoạn mã trên sẽ cập nhật biến mNavigator mà bạn đã khai báo trước đó bằng đối tượng Navigator đã khởi chạy được truyền vào phương thức này.
Cuối cùng, hãy thêm một lệnh gọi vào phương thức initializeNavigationApi từ phương thức onLocationPermissionGranted.
private fun onLocationPermissionGranted() {
initializeNavigationApi()
}
8. Thêm trình nghe cho các sự kiện điều hướng chính
Khi người dùng làm theo hướng dẫn, Navigation SDK sẽ kích hoạt các sự kiện có thể thông báo cho ứng dụng về những thay đổi quan trọng về trạng thái trên đường đi, chẳng hạn như khi người dùng chuyển hướng hoặc đến đích. Trong tệp MainActivity.kt, hãy thêm các trình nghe để xử lý những sự kiện này:
- Trong lớp
MainActivity, hãy khai báo 2 biến để tham chiếu đến các đối tượng trình nghe sự kiện:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
- Thêm một phương thức
registerNavigationListeners()để thiết lập trình nghe khi Navigator được khởi chạy. Phương thức này gọiNavigator.clearDestinations()để đặt lạiNavigationViewkhi sự kiện Đến được kích hoạt:
/**
* Registers a number of example event listeners that show an on screen message when certain
* navigation events occur (e.g. the driver's route changes or the destination is reached).
*/
private fun registerNavigationListeners() {
withNavigatorAsync {
arrivalListener =
Navigator.ArrivalListener { // Show an onscreen message
showToast("User has arrived at the destination!")
mNavigator?.clearDestinations()
}
mNavigator?.addArrivalListener(arrivalListener)
routeChangedListener =
Navigator.RouteChangedListener { // Show an onscreen message when the route changes
showToast("onRouteChanged: the driver's route changed")
}
mNavigator?.addRouteChangedListener(routeChangedListener)
}
}
- Thêm một lệnh gọi đến
registerNavigationListeners()từ mã gọi lạionNavigatorReadytrong phương thứcinitializeNavigationApi:
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
//listen for events en route
registerNavigationListeners()
}
- Định cấu hình giao diện người dùng. Bạn có thể kiểm soát nhiều khía cạnh của giao diện người dùng điều hướng khi hướng dẫn đang chạy. Một điểm tuỳ chỉnh quan trọng là vị trí camera. Thêm một lệnh gọi vào phương thức
setTaskRemovedBehaviourcủa đối tượngnavigatortrả về trongonNavigatorReadynhư sau. Thao tác này sẽ kết thúc chỉ dẫn và thông báo nếu ứng dụng bị vuốt đi:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
- Thêm một lệnh gọi vào
GoogleMap.followMyLocationđể chỉ định mộtCameraPerspective.GoogleMapđược truy cập thông qua phương thứcNavigatorView.getMapAsync()như sau:
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
- Để đảm bảo chức năng điều hướng hoạt động trơn tru trong suốt vòng đời của ứng dụng, hãy triển khai các phương thức sau trong lớp
MainActivity:
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
navView.onSaveInstanceState(savedInstanceState)
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
navView.onTrimMemory(level)
}
override fun onStart() {
super.onStart()
navView.onStart()
}
override fun onResume() {
super.onResume()
navView.onResume()
}
override fun onPause() {
navView.onPause()
super.onPause()
}
override fun onConfigurationChanged(configuration: Configuration) {
super.onConfigurationChanged(configuration)
navView.onConfigurationChanged(configuration)
}
override fun onStop() {
navView.onStop()
super.onStop()
}
override fun onDestroy() {
navView.onDestroy()
withNavigatorAsync {
// Unregister event listeners to avoid memory leaks.
if (arrivalListener != null) {
navigator.removeArrivalListener(arrivalListener)
}
if (routeChangedListener != null) {
navigator.removeRouteChangedListener(routeChangedListener)
}
navigator.simulator?.unsetUserLocation()
navigator.cleanup()
}
super.onDestroy()
}
9. Đặt đích đến
Giờ đây, bạn đã sẵn sàng đặt đích đến và bắt đầu nhận chỉ dẫn đường đi. Trong tệp MainActivity.kt, hãy thực hiện các thay đổi sau:
- Thêm một phương thức
navigateToPlace()mới để đặt đích đến điều hướng và chấp nhận tham sốplaceId.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {
}
- Trong phương thức
navigateToPlace(), hãy sử dụng phương thứcWaypoint.builder()để tạoWaypointtừ Mã địa điểm được truyền đến phương thức. Xử lýUnsupportedPlaceIdExceptionmà thao tác này có thể gửi, trong trường hợp Mã địa điểm không phân giải thành một địa chỉ chính xác:
val waypoint: Waypoint? =
// Set a destination by using a Place ID (the recommended method)
try {
Waypoint.builder().setPlaceIdString(placeId).build()
} catch (e: Waypoint.UnsupportedPlaceIdException) {
showToast("Place ID was unsupported.")
return
}
- Thêm mã sau vào phương thức
navigateToPlace()để đặt một đích đến bằng Điểm tham chiếu:
val pendingRoute = mNavigator?.setDestination(waypoint)
// Set an action to perform when a route is determined to the destination
pendingRoute?.setOnResultListener { code ->
when (code) {
RouteStatus.OK -> {
// Code to start guidance will go here
}
RouteStatus.ROUTE_CANCELED -> showToast("Route guidance canceled.")
RouteStatus.NO_ROUTE_FOUND,
RouteStatus.NETWORK_ERROR ->
// TODO: Add logic to handle when a route could not be determined
showToast("Error starting guidance: $code")
else -> showToast("Error starting guidance: $code")
}
}
Đối tượng Navigator có phương thức setDestinations() có thể nhận nhiều tham số. Lựa chọn cơ bản nhất là cung cấp một Waypoint. Chế độ này sẽ mặc định là chế độ di chuyển DRIVING, phù hợp với ô tô 4 bánh. Phương thức setDestinations() trả về một đối tượng ListenableResultFuture chứa một đối tượng RouteStatus. RouteStatus sẽ cho biết liệu có tìm thấy tuyến đường đến đích đến hay không và cho phép bạn xử lý nhiều trạng thái lỗi nếu không tìm thấy.
- Thực hiện các thay đổi về cấu hình bổ sung để cải thiện trải nghiệm người dùng khi điều hướng:
// Hide the toolbar to maximize the navigation UI
supportActionBar?.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?.simulator?.simulateLocationsAlongExistingRoute(
SimulationOptions().speedMultiplier(5f)
)
}
Những thay đổi này bao gồm các điểm cải tiến sau:
- Ẩn Thanh thao tác để tối đa hoá không gian cho Giao diện người dùng điều hướng.
- Bật hướng dẫn bằng âm thanh để đọc cảnh báo và hướng dẫn di chuyển.
- Thiết lập Trình mô phỏng để gỡ lỗi bằng cách chỉ định hệ số nhân tốc độ.
- Tìm một mã địa điểm sẽ đóng vai trò là điểm đến của bạn. Tốt nhất là vị trí này không nên quá xa vị trí của người dùng. Sử dụng tiện ích Công cụ tìm Mã địa điểm trên Google Maps Platform hoặc lấy Mã địa điểm từ một Lệnh gọi API Places.
Nếu đang mô phỏng chế độ chỉ đường, bạn có thể đặt vị trí của người dùng trong mã hoặc lấy vị trí đó từ thiết bị thông minh được kết nối. Lớp học lập trình này giả định rằng bạn đang mô phỏng một vị trí ở London, Vương quốc Anh.
- Thêm một đối tượng đi kèm vào lớp
MainActivityđể lưu trữ vị trí bắt đầu và mã địa điểm. Lớp học lập trình này sẽ sử dụng vị trí bắt đầu ở London và Mã địa điểm của Quảng trường Trafalgar:
companion object{
const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
val startLocation = LatLng(51.345678, -0.1234456)
}
- Thêm một lệnh gọi vào phương thức
navigateToPlace()từ lệnh gọi lạionNavigatorReadybên trong phương thứcinitializeNavigationApi, đồng thời thêm một nhánh logic sẽ thực thi ở chế độ Gỡ lỗi, đặt vị trí của người dùng:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
mNavigator = navigator
if (BuildConfig.DEBUG) {
mNavigator?.simulator?.setUserLocation(MainActivity.startLocation)
}
//listen for events en route
registerNavigationListeners()
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
//navigate to a destination
navigateToPlace(MainActivity.TRAFALGAR_SQUARE)
10. Tạo và chạy mã
Vào lần đầu tiên chạy ứng dụng, bạn cần cấp quyền truy cập thông tin vị trí cho ứng dụng và chấp nhận điều khoản sử dụng Navigation SDK.
Lưu ý: việc chạy ứng dụng sẽ gọi phương thức setDestinations() và bạn sẽ phải trả phí sau khi sử dụng 1.000 đích đến đầu tiên. Hãy xem phần Mức sử dụng và phí để biết thêm thông tin.


Thiết lập vị trí
Theo mặc định, thiết bị được mô phỏng có thể được đặt vị trí thành khuôn viên của Google ở Mountain View, California, trừ phi bạn đã đặt vị trí trong mã hoặc sử dụng hộp thoại thuộc tính trình mô phỏng.
Nếu vậy, có thể bạn sẽ thấy ứng dụng không tìm được đường đến Mã địa điểm mà bạn đã định cấu hình (theo mặc định là Nhà hát Opera Sydney, Sydney, Úc). Điều này sẽ được biểu thị bằng thông báo "Không tìm thấy tuyến đường" do phương thức showToast() của bạn hiển thị.

Mã hoá cứng vị trí bắt đầu
Để đặt một vị trí khác trong mã, hãy thêm dòng sau vào phương thức navigateToPlace() trong MainActivity.kt, trước khi gọi mNavigator.startGuidance():
mNavigator?.simulator?.setUserLocation(startLocation)
Khởi động trình mô phỏng tại một vị trí mặc định mà bạn chọn
Để đặt một vị trí khác trong trình mô phỏng thiết bị, hãy khởi động trình mô phỏng nếu trình mô phỏng chưa chạy, rồi nhấp vào trình đơn 3 dấu chấm có chú thích "Chế độ điều khiển mở rộng". Hộp thoại mở ra có một lựa chọn trong trình đơn là "Vị trí".
Ví dụ: nếu bạn đang sử dụng Mã địa điểm của Nhà hát Opera Sydney làm đích đến, hãy chọn một vị trí ở Sydney, Úc. Ví dụ: tìm kiếm "Bãi biển Bondi", chọn một đề xuất rồi nhấp vào "Lưu vị trí" ở dưới cùng bên phải của hộp thoại. Bạn cũng có thể nhấp vào "Lưu điểm" để thêm vị trí vào danh sách đã lưu để sử dụng sau này.

Nếu bạn đặt một Mã địa điểm khác làm đích đến, hãy chọn một vị trí gần với mã địa điểm đó để tuyến đường mô phỏng là một tuyến đường thực tế và không quá dài để dễ dàng gỡ lỗi.
Khởi động lại ứng dụng và ứng dụng sẽ chuyển đến đích đến.

11. Xin chúc mừng!
Bạn đã hoàn tất lớp học lập trình này. Bạn đã đến nơi! Chúc bạn lập trình vui vẻ :-)

12. Tiến xa hơn
Nếu bạn muốn phát triển ứng dụng hơn nữa, hãy xem các chủ đề sau để lấy cảm hứng.
- Nghe thêm các sự kiện điều hướng. Thêm mã để hiển thị thông báo nếu tài xế đổi tuyến đường hoặc khi họ đến nơi.
- Tuỳ chỉnh giao diện điều hướng.
- Nếu bạn muốn thử thách hơn, hãy xem bạn có thể thêm một chế độ kiểm soát Place Picker của Places API để cho phép người dùng đặt đích đến hay không. Lưu ý: Các ứng dụng minh hoạ Navigation SDK trên GitHub có một chế độ triển khai mẫu.
- Ngăn chặn các vấn đề có thể xảy ra khi gọi các đối tượng Navigator và GoogleMap không đồng bộ bằng cách áp dụng phương pháp được dùng trong các ứng dụng minh hoạ Navigation SDK trên Github. Trong các trường hợp ứng dụng phức tạp hơn, những đối tượng này có thể chưa hoàn tất quá trình khởi tạo khi mã của bạn chạy. Lưu ý: bạn có thể thêm lớp InitializedNavScope vào cuối tệp MainActivity.kt để triển khai rất nhanh.