Google Haritalar Platformu Navigasyon SDK'sı ile basit bir Android navigasyon uygulaması geliştirme

1. Başlamadan önce

Bu codelab'de, önceden yapılandırılmış bir hedefe gitmek için Google Haritalar Platformu Navigasyon SDK'sını kullanan basit bir Android uygulaması oluşturmayı öğreneceksiniz.

İşlemi tamamladığınızda uygulamanız aşağıdaki gibi görünür.

b6c535afde7abd20.png

Ön koşullar

  • Kotlin'de temel Android uygulaması geliştirme konusunda bilgi
  • Haritalar, konumlar, koordinatlar gibi temel Google Haritalar SDK'sı kavramlarına aşinalık.

Neler öğreneceksiniz?

  • Bir hedefe gitmek için Navigasyon SDK'sını kullanan basit bir Android uygulaması oluşturma.
  • Uzak Google Maven deposundan Gezinme SDK'sı entegre etme
  • Navigasyon SDK'sı son kullanıcı şartlarıyla konum izinlerini ve kullanıcı sözleşmesini yönetme
  • SDK'yı başlatma
  • Hedef belirleme ve navigasyon rehberini başlatma.

Gerekenler

  • Android Studio'nun en son kararlı sürümü yüklü. Bu codelab, Android Studio Jellyfish kullanılarak oluşturuldu. Farklı bir sürüm kullanıyorsanız, arayüzün ve bileşenlerin görünümü ve düzeni değişiklik gösterebilir.
  • Faturalandırmanın etkin olduğu bir Google Hesabı ve projesi.
  • USB hata ayıklama özelliğinin etkin olduğu Geliştirici modundaki bir Android cihaz veya Android emülatörü. Hangisini seçtiğiniz, Navigasyon SDK'sının minimum şartlarını karşılamalıdır.

2. Hazırlanın

Google Cloud Platform hesabınız ve faturalandırmanın etkin olduğu bir projeniz yoksa https://developers.google.com/maps/gmp-get-started adresindeki Google Haritalar Platformu'nu kullanmaya başlama talimatlarını uygulayarak Google Cloud projenizi oluşturun.

Console'da Google Cloud projenizi seçin.

Cloud Console'da proje açılır menüsünü tıklayın ve bu codelab için kullanmak istediğiniz projeyi seçin.

Google Cloud Console'daki proje seçici açılır menüsü.

Projenizde Gezinme SDK'sını etkinleştirme

Google Cloud Marketplace'te bu kod laboratuvarının çalışması için gereken Google Haritalar Platformu API'lerini ve SDK'larını etkinleştirin.

API'ler ve Hizmetler > kitaplığına gidip "Gezinme SDK'sı"nı arayın.

Bir arama sonucu göreceksiniz.

Google Cloud Console'da Gezinme SDK'sı sayfasını gösteren API Kitaplığı ekranı.

Ürün Ayrıntıları sayfasını açmak için Navigation SDK sonucunu tıklayın. Projenizde SDK'yı etkinleştirmek için Etkinleştir düğmesini tıklayın.

Bu işlemi Android için Google Haritalar SDK'sı için tekrarlayın.

API anahtarı oluşturma

Cloud Console'un Kimlik Bilgileri sayfasında bir API anahtarı oluşturun. Google Haritalar Platformu'nu kullanmaya başlama başlıklı makalenin hızlı başlangıç bölümündeki 3. adımı uygulayabilirsiniz. Google Haritalar Platformu'na yapılan tüm istekler için API anahtarı gerekir.

3. Örnek proje dosyalarını alma

Bu bölümde, bu codelab için GitHub deposundaki dosyaları klonlayarak temel, boş bir Android Studio projesinin nasıl oluşturulacağı açıklanmaktadır. GitHub deposu, codelab kodunun önceki ve sonraki sürümlerini içerir. Codelab, boş bir proje şablonuyla başlar ve bitmiş duruma kadar derlenir. Takılırsanız depodaki tamamlanmış projeyi referans olarak kullanabilirsiniz.

Bu codelab'in kodunu almak için bu GitHub kod deposunu klonlayın.

git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git

Git yüklü değilse kodu almak için şu düğmeyi tıklayın:

Mümkün olduğunca hızlı bir başlangıç yapmanız için depodaki Starter klasöründe, bu codelab'i uygulamanıza yardımcı olacak bir başlangıç kodu bulabilirsiniz. Başlangıç projesi temel bir uygulama kullanıcı arayüzü ve derleme yapılandırması sağlar ancak Navigasyon SDK'sı eklenmez. Dilediğiniz zaman ileri gitmek veya ilerlemenizi kontrol etmek isteyebileceğiniz için tamamlanmış bir Solution projesi de mevcuttur.

Klonlanan depoyu Android Studio'da açma

Depoyu yerel olarak klonladıktan sonra Android Studio'yu kullanarak Starter klasörünü mevcut bir proje olarak açın.

  1. Android Studio'ya Hoş Geldiniz iletişim kutusunda Aç düğmesini tıklayın.
  2. Klonlanmış deposu kaydettiğiniz klasöre gidin ve üst düzey "codelab-navigation-101-android-kotlin" klasörünün içindeki Starter klasörünü seçin.
  3. Projenin derlenip çalıştığını kontrol edin.

Sanal cihaz ekleyin veya donanım cihazı bağlayın

Android cihazı bilgisayarınıza bağlamak için Donanım cihazında uygulama çalıştırma başlıklı Android Studio talimatlarını uygulayın. Alternatif olarak, Android Sanal Cihaz (AVD) Yöneticisi'ni kullanarak sanal bir cihaz yapılandırabilirsiniz. Emülatör seçerken Google API'lerini içeren bir resim seçtiğinizden emin olun.

Android Studio'da Çalıştır menüsünü veya oynat düğmesi simgesini tıklayın. İstendiğinde bir cihaz seçin.

4. Navigasyon SDK'sını uygulamanıza ekleme

Gezinme SDK'sı kitaplığını ve API anahtarınızı projenize ekleme

Navigation SDK kitaplığını uygulamanıza eklemek için uygulama düzeyindeki build.gradle.kts dosyanızı, Navigation SDK'sını Google Maven deposundan almak ve bir sürüm numarası yapılandırmak üzere değiştirmeniz gerekir.

Gezinme SDK'sı sürüm numarasını saklamak için derleme yapılandırmanızda bir değişken oluşturun.

Uygulamanızda kullanılan Navigation SDK sürümünün değerini içerecek şekilde uygulama düzeyinde build.gradle.kts bir değişken ayarlayın. Böylece, gelecekte en son sürüme geçmek kolay olur.

En son sürüm numarası için Navigasyon SDK'sı sürüm notlarını inceleyin.

val navSdkVersion by extra("6.0.0") 

Bu ve diğer değişkenlerin değerlerini Dosya > Proje Yapısı > Değişkenler bölümündeki iletişim kutusunu kullanarak da değiştirebilirsiniz:

668332736b67dc82.png

Derleme yapılandırmasına bağımlılık ekleme

Şimdi aşağıdaki API bağımlılığını uygulama düzeyindeki bağımlılıklar bloğuna ekleyin build.gradle.kts.Kullanılan sürüm, uygulama düzeyindeki build.gradle.kts bölümünde az önce ayarladığınız ${navSdkVersion} değeri olacaktır:

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

API anahtarınızı ekleme

API anahtarını yönetmek için Secrets Gradle eklentisini kullanma

Uygulamanızdaki API anahtarını güvenli bir şekilde yönetmek için Secrets Gradle eklentisini kullanmanızı öneririz. Eklenti, üst düzey build.gradle.kts dosyanızdaki bir bağımlılık olarak ilk proje şablonuna eklenmiştir.

// 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 } 

Üst düzey dizininizdeki secrets.properties dosyasını açın ve YOUR_API_KEY değerini API anahtarınızla değiştirin. secrets.properties, sürüm kontrol sistemine kontrol edilmekten hariç tutulduğu için anahtarınızı bu dosyada depolayın.

MAPS_API_KEY=YOUR_API_KEY 

Bu konu hakkında daha fazla bilgi için Gezinme SDK'sı dokümanlarındaki API anahtarını uygulamanıza ekleme bölümüne bakın.

local.defaults.properties içeriğini doğrulama

Boş proje, en üst düzey dizininizde secrets.properties dosyasıyla aynı olan bir local.defaults.properties dosyası içerir. Dosyayı açıp aşağıdaki kodu inceleyin.

MAPS_API_KEY=DEFAULT_API_KEY 

Bu, secrets.properties projeye eklenmemesi durumunda MAPS_API_KEY mülkü için yedek bir değer sağlamak amacıyla oluşturulur. Böylece derlemeler başarısız olmaz. Bu dosyayı düzenlemeniz gerekmez. MAPS_API_KEY için secrets.properties tanımı bulunamazsa varsayılan değer, çalışma zamanında API anahtarı hatasıyla uygulamanın çalışmasını durdurur.

Android manifest dosyasının belirttiğiniz API anahtarını kullanıp kullanmadığını kontrol edin

app/src/main/AndroidManifest.xml dosyasını açın. MAPS_API_KEY özelliğinin, uygulamanın API anahtarını ayarlamak için kullanıldığını fark edeceksiniz:

<meta-data     android:name="com.google.android.geo.API_KEY"     android:value="${MAPS_API_KEY}" /> 

Uygulama düzeyindeki build.gradle.kts dosyanızı açın ve secrets mülkünü bulun.

Eklentinin propertiesFileName ayarı secrets.properties olarak, defaultPropertiesFileName ayarı ise local.defaults.properties olarak ayarlanmalıdır.

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" } 

Tüm dosyaları kaydedin ve projenizi Gradle ile senkronize edin.

5. Uygulama izinlerini yapılandırma ve temel bir kullanıcı arayüzü ekleme

Tam konum izni isteyin

Navigasyon SDK'sı çalışmak için GPS sinyallerine ihtiyaç duyar. Bu nedenle, uygulamanızın kullanıcıdan tam konum verilerine erişim izni vermesini istemesi gerekir. AndroidManifest.xml'deki <manifest> öğesinin alt öğesi olarak tam konuma erişim iznini ekleyin.

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

Android konum izinleri hakkında daha fazla bilgiyi Android geliştirici dokümanlarının Konum izni isteme bölümünde bulabilirsiniz.

Uygulamanızı Android 14 cihazlarda çalıştırmak için aşağıdaki uses-permission etiketini tam konum erişim izniyle aynı konuma ekleyerek ön plan hizmeti konumu iznini isteyin:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" /> 

Temel kullanıcı arayüzü içeren bir başlatma etkinliği ekleme

Uygulamanız çalıştığında, kullanıcının konumuna erişim izni verip vermediğini kontrol etmek ve olası her senaryoyu ele almak ve henüz izin verilmediyse izin istemek için başlatma sırasında çalıştırılan koda ihtiyacı olacaktır. Bunu yapmak için uygulamanıza temel bir kullanıcı arayüzü ekleyin. Bu codelab'de, Android Studio'da yeni ve boş bir Views etkinliği oluşturduğunuzda oluşturulan kullanıcı arayüzü kullanılır. Bu kodu, navigasyon kullanıcı arayüzü etkinliğine kod eklemeden önce yer izni kontrolünü gerçekleştirecek şekilde uyarlayacaksınız.

Kod düzenleyicide MainActivity.kt dosyasını açın ve temel kullanıcı arayüzünü gösteren kodu inceleyin.

Çalışma zamanında konum erişimi izinleri isteme

Navigasyon SDK'sı başlatılmadan önce uygulamanızın tam konuma erişim isteğini tetiklemesi gerekir.

Bu kontrolün uygulamanız başlatıldığında yapılmasını sağlamak için MainActivity sınıfınıza, etkinliğinizin geçersiz kılınan onCreate() yöntemine bazı kodlar ekleyin.

Aşağıdaki kod, kullanıcının hassas konum izni verip vermediğini kontrol eder. Aksi takdirde izin ister. Bu kodu onCreate() yönteminize ekleyin.

    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 

MainActivity sınıfınıza onLocationPermissionGranted adlı yeni bir işlev ekleyin. Bu işlev, kullanıcı konumunu paylaşma izni verdiğinde sonucu yönetir. Sonraki adımlarda, yeni bir gezinme etkinliği başlatmak için buraya kod ekleyeceğiz.

private fun onLocationPermissionGranted() {    //code to initialize Navigation SDK will go here } 

Projenizi oluşturun. Yapı hatalarınız varsa bulup düzeltin.

Projenizi yeni bir sanal cihazda çalıştırın. Uygulama yüklendiğinde ve başladığında izin isteği iletişim kutusunu görürsünüz.

6. Gezinme kullanıcı arayüzü ekleme

Gezinme kullanıcı arayüzü eklemenin iki yolu vardır: SupportNavigationFragment veya NavigationView.

Basitlik açısından codelab'de NavigationView kullanılmaktadır.

Düzeni düzenleme

NavigationView düzeni eklemek için res/layout/activity_main.xml öğesini düzenleyin.

  1. Dosyayı açıp Kod görünümüne geçin.
  2. Dosyanın tüm içeriğini, aşağıdaki örnekte gösterildiği gibi bir RelativeLayout içinde NavigationView şeklinde yeni bir düzenle değiştirin. Uygulamaya yalnızca bir gezinme görünümü ekleyeceğinizden, basit bir düzen yeterlidir.
  3. Gezinme Görünümünüze "@+id/navigation_view" kimliğini verin.
<?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> 

Gezinme etkinliğini ayarlama

Android Studio'da, düzenleyicide MainActivity.kt dosyasını açın.

Uygulamanızda gezinme deneyiminin doğru şekilde çalıştığından emin olmak için bazı temel kurulum kodları ekleyin. MainActivity.kt dosyasında aşağıdaki değişiklikleri yapın:

  1. NavigationView sınıfınızda NavigationView'nize referans vermek için bir değişken tanımlayın:
private lateinit var navView: NavigationView 
  1. NavigationView öğenizin referansını almak için onCreate() yöntemine bazı kodlar ekleyin:
navView = findViewById(R.id.navigation_view) navView.onCreate(savedInstanceState) 
  1. Navigasyon yardımı sırasında ekranın açık kalmasını sağlamak için onCreate() yöntemine bazı kodlar ekleyin:
// Ensure the screen stays on during nav. window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) 
  1. NavigationView öğenizin kimliğini referans olarak almak için ViewCompat.setOnApplyWindowInsetsListener öğesini çağıran kodu düzenleyin.
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. Kullanıcıya geri bildirim göstermek için sınıfa bir showToast() yöntemi ekleyin:
private fun showToast(errorMessage: String) {    Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show() } 

7. Gezinme SDK'sını başlatma

Artık temel Navigasyon etkinliği kurulumunu tamamladığınıza göre, Navigasyon SDK'sını başlatabilirsiniz. Bunu yapmak için MainActivity.kt dosyanıza aşağıdaki kodu ekleyin:

/** 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")                }            }        },    )  } 

Bu kod, initializeNavigationApi() adlı yeni bir yöntem oluşturur. Bu yöntem, NavigationApi.getNavigator() çağrısı yaparak bir Navigator nesnesine referans alır ve geri çağırmayı işlemek için bir NavigatorListener uygular.

Navigation API başlatılırken NavigationListener.onNavigatorReady yönteminin çağrılacağını ve parametre olarak bir Navigator nesnesi iletileceğini unutmayın. Yukarıdaki kod, daha önce beyan ettiğiniz mNavigator değişkenini bu yönteme iletilen başlatılmış Navigator nesnesiyle günceller.

Son olarak, initializeNavigationApi yönteminize onLocationPermissionGranted yönteminden bir çağrı ekleyin.

private fun onLocationPermissionGranted() {    initializeNavigationApi() } 

8. Önemli gezinme etkinlikleri için işleyiciler ekleme

Kullanıcılarınız yol tarifini takip ederken Navigasyon SDK'sı, uygulamayı yoldaki önemli durum değişiklikleri (ör. kullanıcının rotayı değiştirmesi veya varış noktasına ulaşması) hakkında bilgilendirebilecek etkinlikler tetikler. MainActivity.kt dosyasına şu etkinlikleri işleyecek işleyiciler ekleyin:

  1. MainActivity sınıfında, etkinlik işleyici nesnelerine atıfta bulunacak iki değişken tanımlayın:
private var arrivalListener: Navigator.ArrivalListener? = null private var routeChangedListener: Navigator.RouteChangedListener? = null 
  1. Gezgin başlatıldığında dinleyicileri ayarlamak için bir registerNavigationListeners() yöntemi ekleyin. Bu yöntem, Arrival etkinliği tetiklendiğinde NavigationView değerini sıfırlamak için Navigator.clearDestinations() değerini çağırır:
/** * 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. initializeNavigationApi yöntemindeki onNavigatorReady geri çağırma kodundan registerNavigationListeners() adresine bir arama ekleyin:
override fun onNavigatorReady(navigator: Navigator) {    // store a reference to the Navigator object    mNavigator = navigator     //listen for events en route    registerNavigationListeners()   } 
  1. Kullanıcı arayüzünü yapılandırın. Rehber çalışırken gezinme kullanıcı arayüzünün çeşitli özelliklerini kontrol edebilirsiniz. Önemli özelleştirmelerden biri kamera konumudur. onNavigatorReady içinde döndürülen navigator nesnesinin setTaskRemovedBehaviour yöntemine aşağıdaki gibi bir çağrı ekleyin. Uygulama kaydırılarak kaldırılırsa bu işlem sonucunda yönlendirme ve bildirim sonlandırılır:
// 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. CameraPerspective belirtmek için GoogleMap.followMyLocation öğesine bir çağrı ekleyin. GoogleMap'e NavigatorView.getMapAsync() yöntemi aracılığıyla aşağıdaki şekilde erişilir:
navView.getMapAsync {    googleMap  ->    googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED) } 
  1. Gezinmenin uygulama yaşam döngüsü boyunca sorunsuz şekilde çalışmasını sağlamak için MainActivity sınıfınızda aşağıdaki yöntemleri uygulayın:
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. Hedef belirleme

Artık hedef belirlemeye ve navigasyon rehberini başlatmaya hazırsınız. MainActivity.kt dosyasında aşağıdaki değişiklikleri yapın:

  1. Gezinme hedefini ayarlayan ve placeId parametresini kabul eden yeni bir navigateToPlace() yöntemi ekleyin.
/** * Requests directions from the user's current location to a specific place (provided by the * Place ID). */ private fun navigateToPlace(placeId: String) {  } 
  1. navigateToPlace() yönteminizde, yönteme iletilen Yer Kimliği'nden bir Waypoint oluşturmak için Waypoint.builder() yöntemini kullanın. Yer Kimliği'nin tam adresi çözemediği durumlarda, bunun atabileceği UnsupportedPlaceIdException'ı ele alın:
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. Ara noktayı kullanarak hedef belirlemek için navigateToPlace() yönteminize aşağıdaki kodu ekleyin:
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")    } } 

Navigator nesnesi, çeşitli parametreler alabilen bir setDestinations() yöntemine sahiptir. En temel seçenek bir Waypoint belirtmektir. Bu durumda, varsayılan olarak 4 tekerlekli araçlara uygun DRIVING seyahat modu kullanılır. setDestinations() yöntemi, RouteStatus nesnesi içeren bir ListenableResultFuture nesnesi döndürür. RouteStatus, hedefe giden bir rota bulunup bulunmadığını belirtir ve bulunmadıysa çeşitli hata durumlarını ele almanıza olanak tanır.

  1. Kullanıcı gezinme deneyimini iyileştirmek için ek yapılandırma değişiklikleri yapın:
// 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)    ) } 

Bu değişiklikler arasında aşağıdaki iyileştirmeler yer alır:

  • Gezinme kullanıcı arayüzü için alanı en üst düzeye çıkarmak amacıyla işlem çubuğunu gizleme.
  • Uyarıların ve navigasyon talimatlarının okunması için sesli yardımı etkinleştirme.
  • Hız çarpanı belirterek Simülasyon Aracı'nı hata ayıklama için ayarlama.
  1. Hedefiniz olarak kullanılacak bir yer kimliği bulun. İdeal olarak bu, kullanıcının bulunduğu yerden çok uzakta olmamalıdır. Google Haritalar Platformu Yer Kimliği Bulucu yardımcı programını kullanın veya bir Places API çağrısından Yer Kimliği edinin.

Gezinmeyi simüle ediyorsanız kullanıcı konumunu kodda ayarlayabilir veya bağlı cihazınızdan alabilirsiniz. Codelab'de, Birleşik Krallık'ın Londra kentindeki bir konumu simüle ettiğiniz varsayılır.

  1. Başlangıç konumunu ve yer kimliğini depolamak için MainActivity sınıfınıza bir tamamlayıcı nesne ekleyin. Codelab'de Londra'da bir başlangıç konumu ve Trafalgar Meydanı'nın Yer Kimliği kullanılır:
companion object{    const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK    val startLocation = LatLng(51.345678, -0.1234456) } 
  1. initializeNavigationApi yöntemindeki onNavigatorReady geri çağırma işlevinden navigateToPlace() yönteminize bir çağrı ekleyin ve hata ayıklama modunda çalışacak, kullanıcı konumunu ayarlayan bir mantık dalı ekleyin:
// 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. Kodunuzu derleyip çalıştırma

Uygulamayı ilk kez çalıştırdığınızda uygulamaya konum izinleri vermeniz ve Gezinme SDK'sı kullanım şartlarını kabul etmeniz gerekir.

Not: Uygulama çalıştırıldığında, kullanılan ilk 1.000 hedeften sonra ücret alınmasına neden olan setDestinations() yöntemi çağrılır. Daha fazla bilgi için Kullanım ve faturalandırma bölümüne bakın.

93aa433000a14dfc.png

Gezinme SDK&#39;sı son kullanıcı şartları iletişim kutusu.

Konum ayarlama

Kodda bir konum ayarlamadığınız sürece veya emülatör özellikleri iletişim kutusunu kullanarak, emülasyonlu cihazın konumu varsayılan olarak Mountain View California'daki Google kampüsüne ayarlanmış olabilir.

Öyleyse uygulamanın, yapılandırdığınız Place ID'ye (varsayılan olarak Sidney Opera Binası, Sidney, Avustralya) giden bir rota bulamadığını görebilirsiniz. Bu durum, showToast() yönteminiz tarafından "No route found" (Rota bulunamadı) mesajıyla gösterilir.

Mountain View, Kaliforniya&#39;daki Google ofisini gösteren Navigasyon uygulaması harita görünümü.

Başlangıç konumunu sabit kodlama

Kodda farklı bir konum ayarlamak için MainActivity.kt'de navigateToPlace() yönteminizde, mNavigator.startGuidance() çağrısından önce aşağıdaki satırı ekleyin:

mNavigator?.simulator?.setUserLocation(startLocation) 

Emülatörü seçtiğiniz varsayılan bir konumda başlatma

Cihaz emülatöründe farklı bir konum ayarlamak için emülatörü (çalışmıyorsa) başlatın ve "Genişletilmiş Denetimler" ipucunun bulunduğu 3 noktalı menüyü tıklayın. Açılan iletişim kutusunda "Konum" için bir menü seçeneği bulunur.

Örneğin, hedef olarak Sidney Opera Binası'nın yer kimliğini kullanıyorsanız Avustralya'nın Sidney şehrinde bir konum seçin. Örneğin, "Bondi plajı" araması yapın, bir öneri seçin ve "Konumu Kaydet"i tıklayın tıklayın. Ayrıca, "Noktayı Kaydet"i de tıklayabilirsiniz simgesini tıklayın.

Android Cihaz Yöneticisi&#39;ndeki Genişletilmiş Denetimler iletişim kutusu. Bu iletişim kutusunda bir yer seçici ve Avustralya&#39;daki Bondi Plajı&#39;nın ortasına yerleştirilmiş bir harita gösterilmektedir.

Hedef olarak farklı bir Yer Kimliği ayarlarsanız, simüle edilen rotanın gerçekçi olması ve kolay hata ayıklama için çok uzun olmaması için bu konumun yakınındaki bir konumu seçin.

Uygulamayı yeniden başlatın. Artık hedefe gidecektir.

Hedefe rehberlik eden Navigasyon uygulamasının ekran görüntüsü.

11. Tebrikler!

Bu codelab'i tamamladınız. Tebrikler, hedefinize ulaştınız. Keyifli kodlamalar :-)

55812f33256c0596.png

12. İşi daha ileri taşıma

Uygulama geliştirme sürecinizi daha ileriye taşımak istiyorsanız ilham almak için aşağıdaki konulara göz atın.