1. Sebelum memulai
Codelab ini mengajarkan cara membuat aplikasi Android sederhana yang menggunakan Google Maps Platform Navigation SDK untuk menavigasi ke tujuan yang telah dikonfigurasi sebelumnya.
Seperti inilah tampilan aplikasi Anda saat selesai.
Prasyarat
- Mengetahui pengembangan Aplikasi Android dasar di Kotlin
- Sedikit pengetahuan tentang konsep dasar Google Maps SDK seperti peta, lokasi, koordinat.
Yang akan Anda pelajari
- Cara membuat aplikasi Android sederhana yang menggunakan Navigation SDK untuk menavigasi ke tujuan.
- Cara mengintegrasikan Navigation SDK dari repositori Google Maven jarak jauh
- Cara mengelola izin akses lokasi dan perjanjian pengguna dengan persyaratan pengguna akhir Navigation SDK
- Cara menginisialisasi SDK
- Cara menetapkan tujuan dan memulai panduan navigasi.
Yang Anda butuhkan
- Versi stabil terbaru Android Studio yang diinstal. Codelab ini dibuat menggunakan Android Studio Jellyfish. Jika Anda menggunakan versi yang berbeda, tampilan dan tata letak antarmuka dan komponen dapat bervariasi.
- Akun Google dan Project dengan penagihan diaktifkan.
- Perangkat Android dalam mode Developer dengan proses debug USB diaktifkan, atau emulator Android. Mana pun yang Anda pilih harus memenuhi persyaratan minimum untuk Navigation SDK
2. Memulai persiapan
Jika Anda belum memiliki akun Google Cloud Platform dan project yang mengaktifkan penagihan, siapkan project Google Cloud Anda dengan mengikuti petunjuk Mulai menggunakan Google Maps Platform https://developers.google.com/maps/gmp-get-started
Pilih project Google Cloud di konsol
Di Cloud Console, klik menu drop-down project, lalu pilih project yang ingin Anda gunakan untuk codelab ini.
Mengaktifkan Navigation SDK di project Anda
Aktifkan API dan SDK Google Maps Platform yang diperlukan untuk codelab ini di Google Cloud Marketplace.
Buka API & Services > Library di Konsol Google Cloud, lalu telusuri "Navigation SDK".
Anda akan melihat satu hasil penelusuran.
Klik hasil Navigation SDK untuk membuka halaman Detail Produk. Klik tombol Aktifkan untuk mengaktifkan SDK di project Anda.
Ulangi proses ini untuk Google Maps SDK for Android.
Membuat kunci API
Buat kunci API di halaman Kredensial di Cloud Console. Anda dapat mengikuti langkah-langkah dalam langkah 3 di bagian panduan memulai di Memulai Google Maps Platform. Semua permintaan ke Google Maps Platform memerlukan kunci API.
3. Mendapatkan file project contoh
Bagian ini menjelaskan cara menyiapkan project Android Studio kosong dasar dengan meng-clone file dari repositori GitHub untuk codelab ini. Repo GitHub berisi versi sebelum dan sesudah kode codelab. Codelab akan dimulai dengan template project kosong dan di-build hingga status selesai. Anda dapat menggunakan project yang sudah selesai di repo sebagai referensi jika mengalami kesulitan.
Clone repo GitHub ini untuk mendapatkan kode codelab ini.
git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git
Jika Anda belum menginstal git, klik tombol ini untuk mendapatkan kode:
Untuk membantu Anda memulai secepatnya, repositori berisi beberapa kode awal di folder Starter
untuk membantu Anda mengikuti codelab ini. Project awal menyediakan UI aplikasi dasar dan konfigurasi build, tetapi tidak memiliki Navigation SDK yang ditambahkan ke dalamnya. Ada juga project Solution
yang sudah selesai jika Anda ingin langsung melanjutkan atau memeriksa progres Anda kapan saja.
Membuka repo yang di-clone di Android Studio
Setelah meng-clone repo secara lokal, gunakan Android Studio untuk membuka folder Starter
sebagai project yang ada.
- Dari dialog Welcome to Android Studio, klik tombol Open.
- Buka folder tempat Anda menyimpan repo yang di-clone dan pilih folder
Starter
di dalam folder "codelab-navigation-101-android-kotlin
" tingkat teratas. - Pastikan project dibuat dan berjalan.
Menambahkan perangkat virtual, atau menghubungkan perangkat hardware
Untuk menghubungkan perangkat Android ke komputer, ikuti petunjuk Android Studio tentang cara Menjalankan aplikasi di perangkat hardware. Atau, Anda dapat mengonfigurasi perangkat virtual menggunakan AVD Manager. Saat memilih emulator, pastikan Anda memilih image yang berisi Google API.
Di Android Studio, klik opsi menu Run atau ikon tombol putar. Pilih perangkat saat diminta.
4. Menambahkan Navigation SDK ke aplikasi
Menambahkan library Navigation SDK dan kunci API ke project Anda
Untuk menambahkan library Navigation SDK ke aplikasi, Anda perlu memodifikasi build.gradle.kts
level aplikasi untuk mengambil Navigation SDK dari repositori Google Maven dan mengonfigurasi nomor versinya.
Buat variabel dalam konfigurasi build Anda untuk menyimpan nomor versi Navigation SDK.
Siapkan variabel di build.gradle.kts
tingkat aplikasi untuk memuat nilai versi Navigation SDK yang digunakan di aplikasi Anda, sehingga mudah diubah ke versi terbaru pada masa mendatang.
Periksa catatan rilis Navigation SDK untuk mengetahui nomor versi terbaru.
val navSdkVersion by extra("6.0.0")
Anda juga dapat mengubah nilai variabel ini dan variabel lainnya menggunakan dialog yang ditemukan di File > Project Structure > Variables:
Menambahkan dependensi ke konfigurasi build
Sekarang, tambahkan dependensi API berikut ke blok dependensi di build.gradle.kts.
level aplikasi Anda. Versi yang digunakan akan menjadi nilai ${navSdkVersion}
yang baru saja Anda tetapkan di build.gradle.kts
level aplikasi:
dependencies {
// Include the Google Navigation SDK.
api("com.google.android.libraries.navigation:navigation:${navSdkVersion}")
...
Menambahkan kunci API Anda
Menggunakan plugin Secrets Gradle untuk mengelola kunci API
Sebaiknya gunakan plugin Secrets Gradle untuk mengelola kunci API dengan aman di aplikasi Anda. Plugin telah ditambahkan ke template project awal sebagai dependensi di file build.gradle.kts
level teratas.
// 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
}
Buka file secrets.properties
di direktori tingkat teratas, lalu ganti YOUR_API_KEY
dengan kunci API Anda. Simpan kunci Anda dalam file ini karena secrets.properties
tidak di-check in ke dalam sistem kontrol versi.
MAPS_API_KEY=YOUR_API_KEY
Untuk informasi selengkapnya tentang topik ini, lihat Menambahkan kunci API ke aplikasi Anda dalam dokumentasi Navigation SDK.
Memverifikasi konten local.defaults.properties
Project kosong juga berisi file local.defaults.properties
di direktori tingkat atas, folder yang sama dengan file secrets.properties
. Buka dan amati kode berikut.
MAPS_API_KEY=DEFAULT_API_KEY
Fungsi ini dibuat untuk memberikan nilai cadangan bagi properti MAPS_API_KEY
jika secrets.properties
tidak ditambahkan ke project agar build tidak gagal. Anda tidak perlu mengedit file ini. Jika definisi secrets.properties
dari MAPS_API_KEY
tidak ditemukan, nilai default akan menghentikan aplikasi berjalan saat runtime, dengan error kunci API.
Memastikan Manifes Android menggunakan kunci API yang Anda tentukan
Buka app/src/main/AndroidManifest.xml. Anda akan melihat bahwa properti MAPS_API_KEY
digunakan untuk menyetel kunci API untuk aplikasi:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
Buka file build.gradle.kts
tingkat aplikasi dan temukan properti secrets
.
Setelan propertiesFileName
plugin harus disetel ke secrets.properties
, dan defaultPropertiesFileName
harus membaca 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"
}
Simpan semua file dan sinkronkan project Anda dengan Gradle.
5. Mengonfigurasi izin aplikasi dan menambahkan UI dasar
Meminta izin akses lokasi presisi
Navigation SDK bergantung pada sinyal GPS agar dapat berfungsi, sehingga aplikasi Anda perlu meminta pengguna untuk memberikan akses ke data lokasi akurat. Tambahkan izin untuk mengakses lokasi akurat sebagai turunan elemen <manifest>
di 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>
Anda dapat membaca selengkapnya tentang izin akses lokasi Android di bagian Meminta izin akses lokasi dalam dokumentasi developer Android.
Untuk menjalankan aplikasi di perangkat Android 14, minta izin Lokasi Layanan Latar Depan dengan menambahkan tag uses-permission
berikut di lokasi yang sama dengan izin akses lokasi presisi:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
Menambahkan aktivitas peluncuran dengan UI dasar
Saat berjalan, aplikasi Anda akan memerlukan kode yang dieksekusi selama startup untuk memeriksa apakah pengguna telah memberikan izin untuk mengakses lokasinya, dan menangani setiap skenario yang mungkin terjadi, meminta izin jika belum diberikan. Untuk melakukannya, tambahkan antarmuka pengguna dasar ke aplikasi Anda. Codelab ini menggunakan UI yang dibuat saat Anda membuat aktivitas View baru yang kosong di Android Studio. Anda akan menyesuaikannya untuk melakukan pemeriksaan izin akses lokasi sebelum menambahkan kode ke aktivitas untuk UI navigasi.
Buka file MainActivity.kt
di editor kode dan periksa kodenya, yang menampilkan UI dasar.
Meminta izin akses lokasi saat runtime
Aplikasi Anda harus memicu permintaan untuk mengakses lokasi akurat sebelum Navigation SDK diinisialisasi.
Untuk memastikan pemeriksaan ini terjadi saat aplikasi dimulai, tambahkan beberapa kode ke class MainActivity
, dalam metode onCreate()
yang diganti dari Aktivitas Anda.
Kode berikut akan memeriksa apakah pengguna telah memberikan izin akses lokasi akurat. Jika tidak, kode ini akan meminta izin. Tambahkan kode ini di dalam metode onCreate()
Anda.
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
Tambahkan fungsi baru ke class MainActivity
, yang disebut onLocationPermissionGranted
, yang akan menangani hasil saat pengguna memberikan izin untuk membagikan lokasinya. Pada langkah berikutnya, kita akan menambahkan kode di sini untuk meluncurkan aktivitas navigasi baru.
private fun onLocationPermissionGranted() {
//code to initialize Navigation SDK will go here
}
Build project Anda. Jika Anda mengalami error build, temukan dan perbaiki error tersebut.
Jalankan project Anda di perangkat virtual baru. Anda akan melihat dialog permintaan izin muncul saat aplikasi diinstal dan dimulai.
6. Menambahkan antarmuka pengguna navigasi
Ada dua cara untuk menambahkan UI Navigasi: SupportNavigationFragment
atau NavigationView
.
Untuk mempermudah, codelab menggunakan NavigationView
.
Mengedit tata letak
Edit res/layout/activity_main.xml
untuk menambahkan tata letak untuk NavigationView.
- Buka file dan beralih ke Tampilan kode.
- Ganti seluruh konten file dengan tata letak baru
NavigationView
di dalamRelativeLayout
seperti pada contoh di bawah. Karena Anda hanya akan menambahkan tampilan navigasi ke aplikasi, tata letak sederhana dapat digunakan. - Berikan ID "
@+id/navigation_view
" ke NavigationView Anda.
<?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>
Menyiapkan aktivitas Navigasi
Di Android Studio, buka file MainActivity.kt di editor.
Tambahkan beberapa kode penyiapan dasar untuk memastikan pengalaman navigasi berfungsi dengan benar di aplikasi Anda. Di file MainActivity.kt, buat perubahan berikut:
- Deklarasikan variabel di class
MainActivity
untuk mereferensikanNavigationView
:
private lateinit var navView: NavigationView
- Tambahkan beberapa kode ke metode
onCreate()
untuk mendapatkan referensi keNavigationView
Anda:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
- Tambahkan beberapa kode ke metode
onCreate()
untuk memastikan layar tetap aktif selama panduan navigasi:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
- Edit kode yang memanggil
ViewCompat.setOnApplyWindowInsetsListener
untuk mereferensikan IDNavigationView
Anda.
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
}
- Tambahkan metode
showToast()
ke class untuk menampilkan masukan kepada pengguna:
private fun showToast(errorMessage: String) {
Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show()
}
7. Melakukan inisialisasi Navigation SDK
Setelah menyelesaikan penyiapan aktivitas Navigasi dasar, Anda dapat melakukan inisialisasi Navigation SDK. Untuk melakukannya, tambahkan kode berikut ke file MainActivity.kt Anda:
/** 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")
}
}
},
)
}
Kode ini membuat metode baru yang disebut initializeNavigationApi()
. Metode ini mendapatkan referensi ke objek Navigator
dengan memanggil NavigationApi.getNavigator()
dan menerapkan NavigatorListener
untuk menangani callback.
Perhatikan bahwa saat Navigation API diinisialisasi, metode NavigationListener.onNavigatorReady
akan dipanggil, dengan objek Navigator
yang diteruskan sebagai parameter. Kode di atas akan memperbarui variabel mNavigator
yang Anda deklarasikan sebelumnya dengan objek Navigator
yang diinisialisasi dan diteruskan ke metode ini.
Terakhir, tambahkan panggilan ke metode initializeNavigationApi
dari metode onLocationPermissionGranted
.
private fun onLocationPermissionGranted() {
initializeNavigationApi()
}
8. Menambahkan pemroses untuk peristiwa navigasi utama
Saat pengguna mengikuti panduan, Navigation SDK akan mengaktifkan peristiwa yang dapat memberi tahu aplikasi tentang perubahan status utama yang terjadi, seperti saat pengguna mengubah rute atau tiba di tujuan mereka. Dalam file MainActivity.kt, tambahkan pemroses untuk menangani peristiwa ini:
- Dalam class
MainActivity
, deklarasikan dua variabel untuk merujuk ke objek pemroses peristiwa:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
- Menambahkan metode
registerNavigationListeners()
untuk menyiapkan pemroses saat Navigator diinisialisasi. Metode ini memanggilNavigator.clearDestinations()
untuk meresetNavigationView
saat peristiwa Kedatangan diaktifkan:
/**
* 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)
}
}
- Tambahkan panggilan ke
registerNavigationListeners()
dari kode callbackonNavigatorReady
dalam metodeinitializeNavigationApi
:
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
//listen for events en route
registerNavigationListeners()
}
- Mengonfigurasi antarmuka pengguna. Anda dapat mengontrol berbagai aspek antarmuka pengguna navigasi saat panduan berjalan. Salah satu penyesuaian penting adalah posisi kamera. Tambahkan panggilan ke metode
setTaskRemovedBehaviour
dari objeknavigator
yang ditampilkan dionNavigatorReady
sebagai berikut. Tindakan ini akan menghentikan panduan dan notifikasi jika aplikasi digeser:
// 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)
- Tambahkan panggilan ke
GoogleMap.followMyLocation
untuk menentukanCameraPerspective
.GoogleMap
diakses melalui metodeNavigatorView.getMapAsync()
sebagai berikut:
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
- Untuk memastikan navigasi berfungsi dengan lancar selama siklus proses aplikasi, terapkan metode berikut di class
MainActivity
Anda:
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. Menetapkan tujuan
Sekarang Anda siap untuk menetapkan tujuan dan memulai panduan navigasi. Di file MainActivity.kt, buat perubahan berikut:
- Tambahkan metode
navigateToPlace()
baru yang menetapkan tujuan navigasi dan menerima parameterplaceId
.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {
}
- Dalam metode
navigateToPlace()
, gunakan metodeWaypoint.builder()
untuk membuatWaypoint
dari ID Tempat yang diteruskan ke metode. TanganiUnsupportedPlaceIdException
yang dapat ditampilkan, untuk situasi saat ID Tempat tidak di-resolve ke alamat yang tepat:
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
}
- Tambahkan kode berikut ke metode
navigateToPlace()
Anda untuk menetapkan tujuan menggunakan Titik Jalan:
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")
}
}
Objek Navigator
memiliki metode setDestinations()
yang dapat menggunakan berbagai parameter. Opsi paling dasar adalah menyediakan Waypoint
. Nilai ini akan ditetapkan secara default ke mode perjalanan DRIVING
, yang cocok untuk mobil roda 4. Metode setDestinations()
menampilkan objek ListenableResultFuture
yang berisi objek RouteStatus
. RouteStatus
akan menunjukkan apakah rute ditemukan ke tujuan dan memungkinkan Anda menangani berbagai status error jika tidak.
- Lakukan perubahan konfigurasi tambahan untuk meningkatkan pengalaman pengguna navigasi:
// 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)
)
}
Perubahan ini mencakup peningkatan berikut:
- Menyembunyikan Panel Tindakan untuk memaksimalkan ruang bagi UI Navigasi.
- Mengaktifkan panduan audio untuk mengucapkan notifikasi dan petunjuk navigasi.
- Menyiapkan Simulator untuk proses debug dengan menentukan pengganda kecepatan.
- Temukan ID Tempat yang akan berfungsi sebagai tujuan Anda. Idealnya, ini tidak terlalu jauh dari lokasi pengguna. Gunakan utilitas Place ID Finder Google Maps Platform atau dapatkan ID Tempat dari panggilan Places API.
Jika Anda menyimulasikan navigasi, Anda dapat menyetel lokasi pengguna dalam kode atau mengambilnya dari perangkat yang terhubung. Codelab akan menganggap Anda menyimulasikan lokasi di London, Inggris Raya.
- Tambahkan objek pendamping ke class
MainActivity
untuk menyimpan lokasi awal, dan ID tempat. Codelab ini akan menggunakan lokasi awal di London dan ID Tempat Trafalgar Square:
companion object{
const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
val startLocation = LatLng(51.345678, -0.1234456)
}
- Tambahkan panggilan ke metode
navigateToPlace()
dari callbackonNavigatorReady
di dalam metodeinitializeNavigationApi
, dan tambahkan cabang logika yang akan dieksekusi dalam mode Debug, yang menetapkan lokasi pengguna:
// 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. Mem-build dan menjalankan kode
Saat pertama kali menjalankan aplikasi, Anda harus memberikan izin akses lokasi ke aplikasi, dan menyetujui persyaratan penggunaan Navigation SDK.
Catatan: menjalankan aplikasi akan memanggil metode setDestinations() yang dikenai biaya setelah 1.000 tujuan pertama digunakan. Lihat Penggunaan dan penagihan untuk informasi selengkapnya.
Menetapkan lokasi
Secara default, lokasi perangkat yang diemulasi mungkin disetel ke kampus Google di Mountain View California, kecuali jika Anda telah menetapkan lokasi dalam kode, atau menggunakan dialog properti emulator.
Jika demikian, Anda mungkin mendapati bahwa aplikasi tidak dapat menemukan rute ke ID Tempat yang Anda konfigurasi (secara default, Sydney Opera House, Sydney, Australia). Hal ini akan ditunjukkan dengan pesan yang menyatakan "Tidak ada rute yang ditemukan", yang ditampilkan oleh metode showToast()
Anda.
Melakukan hard coding pada lokasi awal
Untuk menetapkan lokasi yang berbeda dalam kode, tambahkan baris berikut dalam metode navigateToPlace()
di MainActivity.kt, sebelum panggilan ke mNavigator.startGuidance()
:
mNavigator?.simulator?.setUserLocation(startLocation)
Memulai emulator di lokasi default pilihan Anda
Untuk menyetel lokasi yang berbeda di emulator perangkat, mulai emulator jika belum berjalan, lalu klik menu 3 titik dengan tooltip "Extended Controls". Dialog yang terbuka memiliki opsi menu untuk "Lokasi".
Misalnya, jika Anda menggunakan ID Tempat Sydney Opera House sebagai tujuan, pilih lokasi di Sydney, Australia. Misalnya, telusuri "Pantai Bondi", pilih saran, lalu klik "Simpan Lokasi" di kanan bawah dialog. Anda juga dapat mengklik "Save Point" untuk menambahkan lokasi ke daftar tersimpan untuk digunakan di masa mendatang.
Jika Anda menetapkan ID Tempat yang berbeda sebagai tujuan, pilih lokasi terdekat agar rute yang disimulasikan terlihat realistis, dan tidak terlalu panjang untuk memudahkan proses debug.
Mulai ulang aplikasi dan sekarang seharusnya terbuka ke tujuan.
11. Selamat!
Anda telah menyelesaikan codelab ini. Bagus - Anda telah tiba di tujuan. Selamat membuat kode :-)
12. Manfaatkan lebih jauh
Jika Anda ingin melakukan pengembangan aplikasi lebih lanjut, lihat topik berikut untuk mendapatkan inspirasi.
- Memproses peristiwa navigasi lainnya. Tambahkan kode untuk menampilkan pesan jika pengemudi mengubah rute, atau saat mereka tiba.
- Sesuaikan antarmuka navigasi.
- Jika Anda menginginkan tantangan yang lebih besar, lihat apakah Anda dapat menambahkan kontrol Pemilih Tempat Places API agar pengguna dapat menetapkan tujuan. Petunjuk: Aplikasi demo Navigation SDK di GitHub memiliki contoh implementasi.
- Cegah potensi masalah dalam memanggil objek Navigator dan GoogleMap secara asinkron dengan mengadopsi pendekatan yang digunakan di aplikasi demo Navigation SDK di GitHub. Dalam skenario aplikasi yang lebih kompleks, objek ini mungkin belum selesai diinisialisasi saat kode Anda berjalan. Tips: Anda dapat menambahkan class InitializedNavScope di akhir file MainActivity.kt untuk implementasi yang sangat cepat.