Membuat aplikasi navigasi Android sederhana dengan Navigation SDK Google Maps Platform

1. Sebelum memulai

Codelab ini mengajarkan Anda 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.

b6c535afde7abd20.png

Prasyarat

  • Pengetahuan dasar tentang pengembangan Aplikasi Android di Kotlin
  • Beberapa pemahaman 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 Maven Google 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 telah diinstal. Codelab ini dibuat menggunakan Android Studio Jellyfish. Jika Anda menggunakan versi yang berbeda, tampilan dan tata letak antarmuka serta komponennya mungkin berbeda.
  • Akun Google dan Project dengan penagihan diaktifkan.
  • Perangkat Android dalam mode Developer dengan proses debug USB diaktifkan, atau emulator Android. Apa pun yang Anda pilih, harus memenuhi persyaratan minimum untuk Navigation SDK

2. Memulai persiapan

Jika Anda belum memiliki akun Google Cloud Platform dan project dengan penagihan diaktifkan, siapkan project Google Cloud Anda dengan mengikuti petunjuk Memulai Google Maps Platform di https://developers.google.com/maps/gmp-get-started

Pilih project Google Cloud Anda di konsol

Di Cloud Console, klik menu drop-down project, lalu pilih project yang ingin Anda gunakan untuk codelab ini.

Menu drop-down pemilih project di Konsol Google Cloud.

Mengaktifkan Navigation SDK di project Anda

Aktifkan API dan SDK Google Maps Platform yang diperlukan untuk codelab ini di Google Cloud Marketplace.

Buka APIs & Services > Library di Konsol Google Cloud, lalu telusuri "Navigation SDK".

Anda akan melihat satu hasil penelusuran.

Layar API Library di konsol Google Cloud, yang menampilkan halaman Navigation SDK.

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 di langkah 3 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 dibangun hingga status selesai. Anda dapat menggunakan project yang telah 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 ini berisi beberapa kode awal di folder Starter untuk membantu Anda mengikuti codelab ini. Project awal menyediakan UI aplikasi dan konfigurasi build dasar, tetapi tidak memiliki Navigation SDK yang ditambahkan ke dalamnya. Ada juga project Solution yang sudah selesai jika Anda ingin langsung melihatnya 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.

  1. Dari dialog Welcome to Android Studio, klik tombol Open.
  2. Buka folder tempat Anda menyimpan repo yang di-clone, lalu pilih folder Starter di dalam folder "codelab-navigation-101-android-kotlin" tingkat teratas.
  3. Periksa apakah project dibuat dan berjalan.

Tambahkan perangkat virtual, atau hubungkan 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 Android Virtual Device (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 Anda

Menambahkan library Navigation SDK dan kunci API ke project Anda

Untuk menambahkan library Navigation SDK ke aplikasi, Anda harus mengubah build.gradle.kts tingkat aplikasi untuk mengambil Navigation SDK dari repositori Maven Google dan mengonfigurasi nomor versi.

Buat variabel dalam konfigurasi build 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 Anda dapat dengan mudah beralih ke versi terbaru di 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 ada di File > Project Structure > Variables:

668332736b67dc82.png

Menambahkan dependensi ke konfigurasi build

Sekarang tambahkan dependensi API berikut ke blok dependensi di build.gradle.kts. tingkat aplikasi. Versi yang digunakan akan menjadi nilai ${navSdkVersion} yang baru saja Anda tetapkan di build.gradle.kts tingkat aplikasi:

dependencies {

   // Include the Google Navigation SDK.
   api("com.google.android.libraries.navigation:navigation:${navSdkVersion}")

...

Tambahkan kunci API Anda

Menggunakan plugin Secrets Gradle untuk mengelola kunci API

Sebaiknya gunakan plugin Secrets Gradle untuk mengelola kunci API di aplikasi Anda secara aman. Plugin ini telah ditambahkan ke template project awal sebagai dependensi dalam file build.gradle.kts tingkat teratas Anda.

// 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 mengetahui informasi selengkapnya tentang topik ini, lihat Menambahkan kunci API ke aplikasi Anda dalam dokumentasi Navigation SDK.

Verifikasi konten local.defaults.properties

Project kosong juga berisi file local.defaults.properties di direktori tingkat teratas, folder yang sama dengan file secrets.properties. Buka dan amati kode berikut.

MAPS_API_KEY=DEFAULT_API_KEY

File ini ada untuk memberikan nilai cadangan untuk properti MAPS_API_KEY jika secrets.properties tidak ditambahkan ke project, sehingga build tidak gagal. Anda tidak perlu mengedit file ini. Jika definisi secrets.properties dari MAPS_API_KEY tidak ditemukan, nilai default akan menghentikan aplikasi yang berjalan saat runtime, dengan error kunci API.

Periksa apakah 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 Anda 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 harus meminta pengguna untuk memberikan akses ke data lokasi presisi. Tambahkan izin untuk mengakses lokasi presisi 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 pada dokumentasi developer Android.

Untuk menjalankan aplikasi Anda di perangkat Android 14, minta izin Akses 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 proses mulai untuk memeriksa apakah pengguna telah memberikan izin untuk mengakses lokasinya, dan menangani setiap kemungkinan skenario, dengan meminta izin jika belum diberikan. Untuk melakukannya, tambahkan antarmuka pengguna dasar ke aplikasi Anda. Codelab ini menggunakan UI yang dibuat saat Anda membuat aktivitas Views kosong baru 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 kode, yang menampilkan UI dasar.

Meminta izin akses lokasi saat runtime

Aplikasi Anda harus memicu permintaan untuk mengakses lokasi presisi sebelum Navigation SDK diinisialisasi.

Untuk memastikan pemeriksaan ini terjadi saat aplikasi Anda dimulai, tambahkan beberapa kode ke class MainActivity, dalam metode onCreate() yang diganti di 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
}

Bangun project Anda. Jika ada 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.

  1. Buka file dan beralih ke tampilan Kode.
  2. Ganti seluruh konten file dengan tata letak baru NavigationView di dalam RelativeLayout seperti pada contoh di bawah. Karena Anda hanya akan menambahkan tampilan navigasi ke aplikasi, tata letak sederhana sudah cukup.
  3. Beri NavigationView Anda ID "@+id/navigation_view".
<?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 Navigation

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, lakukan perubahan berikut:

  1. Deklarasikan variabel di class MainActivity untuk mereferensikan NavigationView:
private lateinit var navView: NavigationView
  1. Tambahkan beberapa kode ke metode onCreate() untuk mendapatkan referensi ke NavigationView Anda:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
  1. 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)
  1. Edit kode yang memanggil ViewCompat.setOnApplyWindowInsetsListener untuk mereferensikan ID NavigationView 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
}
  1. 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. Menginisialisasi 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 bernama 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 Anda mengikuti panduan, Navigation SDK akan memicu peristiwa yang dapat memberi tahu aplikasi tentang perubahan status penting di sepanjang rute, seperti saat pengguna mengubah rute atau tiba di tujuan. Di file MainActivity.kt, tambahkan pemroses untuk menangani peristiwa ini:

  1. Dalam class MainActivity, deklarasikan dua variabel untuk merujuk ke objek pemroses peristiwa:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
  1. Tambahkan metode registerNavigationListeners() untuk menyiapkan pemroses saat Navigator diinisialisasi. Metode ini memanggil Navigator.clearDestinations() untuk mereset NavigationView 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)
   }
}
  1. Tambahkan panggilan ke registerNavigationListeners() dari kode callback onNavigatorReady dalam metode initializeNavigationApi:
override fun onNavigatorReady(navigator: Navigator) {
   // store a reference to the Navigator object
   mNavigator = navigator

   //listen for events en route
   registerNavigationListeners()


}
  1. Konfigurasi antarmuka pengguna. Anda dapat mengontrol berbagai aspek antarmuka pengguna navigasi saat panduan sedang berjalan. Salah satu penyesuaian penting adalah posisi kamera. Tambahkan panggilan ke metode setTaskRemovedBehaviour dari objek navigator yang ditampilkan di onNavigatorReady sebagai berikut. Tindakan ini akan menghentikan panduan dan notifikasi jika aplikasi ditutup dengan menggeser:
// 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)
  1. Tambahkan panggilan ke GoogleMap.followMyLocation untuk menentukan CameraPerspective. GoogleMap diakses melalui metode NavigatorView.getMapAsync() sebagai berikut:
navView.getMapAsync {
   googleMap  ->
   googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
  1. Untuk memastikan fungsi navigasi berjalan lancar di seluruh 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 menyetel tujuan dan memulai panduan navigasi. Di file MainActivity.kt, lakukan perubahan berikut:

  1. Tambahkan metode navigateToPlace() baru yang menetapkan tujuan navigasi dan menerima parameter placeId.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {

}
  1. Dalam metode navigateToPlace(), gunakan metode Waypoint.builder() untuk membuat Waypoint dari ID Tempat yang diteruskan ke metode. Tangani UnsupportedPlaceIdException yang dapat muncul, untuk situasi saat ID Tempat tidak dapat diselesaikan 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
}
  1. Tambahkan kode berikut ke metode navigateToPlace() 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 mengambil berbagai parameter. Opsi yang paling dasar adalah menyediakan Waypoint. Nilai defaultnya adalah mode perjalanan DRIVING, yang cocok untuk mobil roda 4. Metode setDestinations() menampilkan objek ListenableResultFuture yang berisi objek RouteStatus. RouteStatus akan menunjukkan apakah rute ke tujuan ditemukan atau tidak dan memungkinkan Anda menangani berbagai status error jika tidak.

  1. 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 Bilah Tindakan untuk memaksimalkan ruang bagi UI Navigasi.
  • Mengaktifkan panduan audio untuk membacakan peringatan dan petunjuk navigasi.
  • Menyiapkan Simulator untuk proses debug dengan menentukan pengganda kecepatan.
  1. Temukan ID Tempat yang akan bertindak sebagai tujuan Anda. Idealnya, lokasi ini tidak terlalu jauh dari lokasi pengguna. Gunakan utilitas Google Maps Platform Place ID Finder 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 ini akan mengasumsikan Anda menyimulasikan lokasi di London, Inggris Raya.

  1. 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)
}
  1. Tambahkan panggilan ke metode navigateToPlace() dari callback onNavigatorReady di dalam metode initializeNavigationApi, 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. Membangun dan menjalankan kode Anda

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 mengetahui informasi selengkapnya.

93aa433000a14dfc.png

Dialog persyaratan pengguna akhir Navigation SDK.

Menetapkan lokasi

Secara default, perangkat yang diemulasi mungkin memiliki lokasi yang ditetapkan ke kampus Google di Mountain View, California, kecuali jika Anda telah menetapkan lokasi dalam kode, atau menggunakan dialog properti emulator.

Jika ya, 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 oleh pesan yang menyatakan "No route found", yang ditampilkan oleh metode showToast() Anda.

Tampilan peta aplikasi Navigasi yang menampilkan kantor Google di Mountain View, California.

Mengodekan lokasi awal secara permanen

Untuk menyetel 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 "Simpan Titik" untuk menambahkan lokasi ke daftar tersimpan untuk digunakan pada lain waktu.

Dialog Kontrol Lanjutan di Pengelola Perangkat Android, yang menampilkan pemilih tempat dan peta yang berpusat di pantai Bondi di Australia.

Jika Anda menetapkan ID Tempat yang berbeda sebagai tujuan, pilih lokasi di dekatnya agar rute simulasi menjadi rute yang realistis, dan tidak terlalu panjang agar mudah di-debug.

Mulai ulang aplikasi dan aplikasi akan membuka tujuan.

Screenshot aplikasi Navigasi yang memberikan panduan ke tujuan.

11. Selamat!

Anda telah menyelesaikan codelab ini. Bagus - Anda telah tiba di tujuan! Selamat melakukan coding :-)

55812f33256c0596.png

12. Manfaatkan lebih jauh

Jika Anda ingin mengembangkan aplikasi lebih lanjut, lihat topik berikut untuk mendapatkan inspirasi.