Membuat aplikasi navigasi Android sederhana dengan Navigation SDK Google Maps Platform

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.

b6c535afde7abd20.png

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.

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 API & Services > Library di Konsol Google Cloud, lalu telusuri "Navigation SDK".

Anda akan melihat satu hasil penelusuran.

Layar Library API di Konsol Google Cloud, 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 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.

  1. Dari dialog Welcome to Android Studio, klik tombol Open.
  2. Buka folder tempat Anda menyimpan repo yang di-clone dan pilih folder Starter di dalam folder "codelab-navigation-101-android-kotlin" tingkat teratas.
  3. 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:

668332736b67dc82.png

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.

  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 dapat digunakan.
  3. 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:

  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. 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:

  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. Menambahkan 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. 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 objek navigator yang ditampilkan di onNavigatorReady 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)
  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 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:

  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 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
}
  1. 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.

  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 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.
  1. 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.

  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. 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.

93aa433000a14dfc.pngS

Dialog persyaratan pengguna akhir Navigation SDK.

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.

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

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.

Dialog Extended Controls di Android Device Manager, yang menampilkan pemilih tempat dan peta yang berpusat di pantai Bondi di Australia.

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.

Screenshot aplikasi Navigasi yang memberikan panduan ke tujuan.

11. Selamat!

Anda telah menyelesaikan codelab ini. Bagus - Anda telah tiba di tujuan. Selamat membuat kode :-)

55812f33256c0596.png

12. Manfaatkan lebih jauh

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