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 Navigation 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 ile temel Android uygulaması geliştirme bilgisi
  • Haritalar, konumlar ve koordinatlar gibi temel Google Haritalar SDK'sı kavramları hakkında bilgi sahibi olmak

Neler öğreneceksiniz?

  • Bir hedefe gitmek için Navigation SDK'yı kullanan basit bir Android uygulaması oluşturma
  • Navigation SDK'yı uzak Google Maven deposundan entegre etme
  • Konum izinlerini ve kullanıcı sözleşmesini Navigation SDK son kullanıcı şartlarıyla yönetme
  • SDK'yı başlatma
  • Hedef belirleme ve navigasyon yardımını başlatma

Gerekenler

  • Android Studio'nun en son kararlı sürümü yüklü olmalıdır. Bu codelab, Android Studio Jellyfish kullanılarak oluşturulmuştur. Farklı bir sürüm kullanıyorsanız arayüzün ve bileşenlerin görünümü ve düzeni farklı olabilir.
  • Faturalandırmanın etkin olduğu bir Google Hesabı ve proje.
  • USB üzerinden hata ayıklama özelliği etkinleştirilmiş Geliştirici modunda bir Android cihaz veya bir Android emülatörü. Hangisini seçerseniz seçin, Navigation SDK'nın minimum şartlarını karşılaması gerekir.

2. Hazırlanın

Henüz bir Google Cloud Platform hesabınız ve faturalandırmanın etkinleştirildiği bir projeniz yoksa Google Cloud projenizi Google Haritalar Platformu'nu kullanmaya başlama talimatlarını uygulayarak ayarlayın https://developers.google.com/maps/gmp-get-started

Google Cloud projenizi konsolda 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 Navigation SDK'yı etkinleştirme

Bu codelab için gereken Google Haritalar Platformu API'lerini ve SDK'larını Google Cloud Marketplace'te etkinleştirin.

Google Cloud Console'da API'ler ve Hizmetler > Kitaplık'a gidip "Navigation SDK"yı arayın.

Bir arama sonucu görürsünüz.

Google Cloud Console'daki API Kitaplığı ekranında Navigation SDK sayfası gösteriliyor.

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

Bu işlemi Android için Haritalar SDK'sı için de 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 bölümündeki hızlı başlangıç kılavuzu bölümünün 3. adımındaki talimatları uygulayabilirsiniz. Google Haritalar Platformu'na yapılan tüm istekler için API anahtarı gerekir.

3. Örnek proje dosyalarını edinme

Bu bölümde, bu codelab'in GitHub deposundaki dosyaları klonlayarak temel bir boş Android Studio projesinin nasıl oluşturulacağı açıklanmaktadır. Github deposu, codelab kodunun öncesi ve sonrası sürümlerini içerir. Bu codelab, boş bir proje şablonuyla başlayıp tamamlanmış duruma kadar ilerleyecektir. 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 bu düğmeyi tıklayın:

Bu kod laboratuvarını takip etmenize yardımcı olmak için Starter klasöründe başlangıç kodları bulunur. Başlangıç projesi, temel bir uygulama kullanıcı arayüzü ve derleme yapılandırması sağlar ancak Navigation SDK'sı eklenmemiştir. Dilerseniz ilerlemek veya ilerleme durumunuzu kontrol etmek için tamamlanmış bir Solution proje de mevcuttur.

Klonlanan depoyu Android Studio'da açma

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

  1. Android Studio'ya Hoş Geldiniz iletişim kutusunda Aç düğmesini tıklayın.
  2. Klonlanan depoyu 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 oluşturulduğunu ve çalıştığını kontrol edin.

Sanal cihaz ekleme veya donanım cihaz bağlama

Bir Android cihazı bilgisayarınıza bağlamak için Android Studio'nun Uygulamaları donanım cihazda çalıştırma ile ilgili talimatlarını uygulayın. Alternatif olarak, Android Sanal Cihaz (AVD) Yöneticisi'ni kullanarak sanal bir cihaz yapılandırabilirsiniz. Bir emülatör seçerken Google API'lerini içeren bir görüntü seçtiğinizden emin olun.

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

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

Navigasyon SDK kitaplığını ve API anahtarınızı projenize ekleyin

Navigasyon SDK kitaplığını uygulamanıza eklemek için uygulama düzeyindeki build.gradle.kts dosyanızı değiştirerek Google Maven deposundan Navigasyon SDK'sını getirmeniz ve bir sürüm numarası yapılandırmanız gerekir.

Derleme yapılandırmanızda Navigation SDK sürüm numarasını depolamak için bir değişken oluşturun.

Uygulama düzeyindeki build.gradle.kts içinde, uygulamanızda kullanılan Navigation SDK sürümünün değerini içerecek bir değişken ayarlayın. Böylece, gelecekte en son sürüme geçiş kolaylaşır.

En son sürüm numarası için Navigation SDK 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'de bulunan 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 build.gradle.kts. dosyanızdaki bağımlılıklar bloğuna ekleyin. Kullanılan sürüm, uygulama düzeyindeki build.gradle.kts dosyanızda yeni ayarladığınız ${navSdkVersion} değeridir:

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. Bu eklenti, üst düzey build.gradle.kts dosyanızda 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
}

En üst düzey dizininizde secrets.properties dosyasını açın ve YOUR_API_KEY kısmını API anahtarınızla değiştirin. secrets.properties, sürüm denetim sistemine dahil edilmediği için anahtarınızı bu dosyada saklayın.

MAPS_API_KEY=YOUR_API_KEY

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

local.defaults.properties dosyasının içeriğini doğrulayın

Boş proje, üst düzey dizininizde local.defaults.properties dosyasını da içerir. Bu dosya, secrets.properties dosyasıyla aynı klasördedir. Dosyayı açın ve aşağıdaki kodu inceleyin.

MAPS_API_KEY=DEFAULT_API_KEY

Bu, secrets.properties projeye eklenmediği takdirde derlemelerin başarısız olmaması için MAPS_API_KEY özelliği için yedek değer sağlamak amacıyla kullanılır. Bu dosyayı düzenlemeniz gerekmez. MAPS_API_KEY için secrets.properties tanımı bulunamazsa varsayılan değer, API anahtarı hatasıyla uygulamanın çalışma zamanında çalışmasını durdurur.

Android Manifest'in, belirttiğiniz API anahtarını kullandığını kontrol edin

app/src/main/AndroidManifest.xml dosyasını açın. MAPS_API_KEY özelliğinin, uygulama için API anahtarını ayarlamak üzere 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 özelliğini bulun.

Eklentinin propertiesFileName ayarı secrets.properties olarak ayarlanmalı ve defaultPropertiesFileName, local.defaults.properties olarak okunmalı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 isteme

Navigation SDK'nın çalışması için GPS sinyallerine ihtiyacı vardır. Bu nedenle uygulamanızın, kullanıcıdan tam konum verilerine erişim izni istemesi gerekir. AndroidManifest.xml dosyasında <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 belgelerinin Konum izinleri isteme bölümünde bulabilirsiniz.

Uygulamanızı Android 14 cihazda çalıştırmak için tam konum erişimi izniyle aynı konuma aşağıdaki uses-permission etiketini ekleyerek ön plan hizmeti konum izni isteğinde bulunun:

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

Temel kullanıcı arayüzüyle başlatma etkinliği ekleme

Uygulamanız çalışırken, kullanıcının konumuna erişim izni verip vermediğini kontrol etmek ve olası her senaryoyu ele almak için başlatma sırasında yürütülen koda ihtiyacı olacaktır. İzin henüz verilmemişse izin isteğinde bulunulur. 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ılmaktadır. Bunu, gezinme kullanıcı arayüzü için etkinliğe kod eklemeden önce konum izni kontrolünü gerçekleştirecek şekilde uyarlayacaksınız.

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

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

Uygulamanız, Navigation SDK başlatılmadan önce tam konuma erişim isteğini tetiklemelidir.

Bu kontrolün uygulamanız başlatıldığında gerçekleşmesini 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 ayrıntılı konum izni verip vermediğini kontrol eder. Aksi takdirde izin istenir. Bu kodu onCreate() yönteminizin içine 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 işler. 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. Derleme hatalarınız varsa bunları bulup düzeltin.

Projenizi yeni bir sanal cihazda çalıştırın. Uygulama yüklenip başlatıldığında izin isteği iletişim kutusunu görmeniz gerekir.

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

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

Bu codelab'de basitlik için NavigationView kullanılır.

Düzeni düzenleme

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

  1. Dosyayı açın ve Kod görünümüne geçin.
  2. Dosyanın tüm içeriğini, aşağıdaki örnekte olduğu gibi RelativeLayout içinde NavigationView öğesinin yeni bir düzeniyle değiştirin. Uygulamaya yalnızca bir gezinme görünümü ekleyeceğiniz için basit bir düzen yeterli olacaktır.
  3. NavigationView'ınıza "@+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 MainActivity.kt dosyasını düzenleyicide açın.

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

  1. MainActivity sınıfınızda NavigationView öğenize referans veren bir değişken tanımlayın:
private lateinit var navView: NavigationView
  1. onCreate() yöntemine, NavigationView öğenize referans almak için kod ekleyin:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
  1. Navigasyon talimatları sırasında ekranın açık kalmasını sağlamak için onCreate() yöntemine biraz kod ekleyin:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
  1. ViewCompat.setOnApplyWindowInsetsListener işlevini çağıran kodu, NavigationView öğenizin kimliğine referans verecek şekilde 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. Navigation SDK'yı başlatma

Temel Navigation etkinliği kurulumunu tamamladığınıza göre artık Navigation SDK'yı 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() işlevini çağırarak Navigator nesnesine referans alır ve geri çağırmayı işlemek için NavigatorListener işlevini uygular.

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

Son olarak, initializeNavigationApi yönteminizden onLocationPermissionGranted yöntemine bir çağrı ekleyin.

private fun onLocationPermissionGranted() {
   initializeNavigationApi()
}

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

Kullanıcılarınız talimatlara uyduğunda Navigation SDK, uygulama içi rota değişikliği veya varış noktasına ulaşma gibi önemli durum değişiklikleri hakkında uygulamayı bilgilendirebilecek etkinlikleri tetikler. MainActivity.kt dosyasında, bu etkinlikleri işleyecek işleyiciler ekleyin:

  1. MainActivity sınıfında, etkinlik işleyici nesnelerini ifade etmek için iki değişken tanımlayın:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
  1. Navigator başlatıldığında işleyicileri ayarlamak için registerNavigationListeners() yöntemi ekleyin. Bu yöntem, varış etkinliği tetiklendiğinde NavigationView değerini sıfırlamak için Navigator.clearDestinations() işlevini ç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() öğesine bir geri çağırma işlevi 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. Rehberlik çalışırken gezinme kullanıcı arayüzünün çeşitli yönlerini kontrol edebilirsiniz. Önemli bir özelleştirme de kamera konumudur. onNavigatorReady içinde döndürülen navigator nesnesinin setTaskRemovedBehaviour yöntemine aşağıdaki gibi bir çağrı ekleyin. Bu ayar, uygulama kaydırılarak kapatılırsa rehberliği ve bildirimi sonlandırı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 numarasına telefon etme seçeneği ekleyin. GoogleMap, NavigatorView.getMapAsync() yöntemiyle aşağıdaki şekilde erişilir:
navView.getMapAsync {
   googleMap  ->
   googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
  1. Uygulama yaşam döngüsü boyunca gezinme işlevlerinin sorunsuz ç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 bir hedef belirleyip navigasyon talimatlarını başlatmaya hazırsınız. MainActivity.kt dosyasında aşağıdaki değişiklikleri yapın:

  1. Geçiş 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ğinden Waypoint oluşturmak için Waypoint.builder() yöntemini kullanın. Yer Kimliğinin kesin bir adrese çözümlenmediği durumlarda bu işlemin hata verebileceği UnsupportedPlaceIdException değerini işleyin:
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 nokta 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 nesnesinde, çeşitli parametreler alabilen bir setDestinations() yöntemi vardır. En temel seçenek, Waypoint sağlamaktır. Bu mod, 4 tekerlekli arabalar için uygun olan DRIVING seyahat moduna ayarlanır. setDestinations() yöntemi, RouteStatus nesnesi içeren bir ListenableResultFuture nesnesi döndürür. RouteStatus simgesi, hedefe giden bir rota bulunup bulunmadığını gösterir ve bulunmaması durumunda çeşitli hata durumlarını yönetmenize olanak tanır.

  1. Gezinme kullanıcı 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 aşağıdaki iyileştirmeleri içerir:

  • Gezinme kullanıcı arayüzü için alanı en üst düzeye çıkarmak amacıyla işlem çubuğunu gizleme.
  • Uyarıları ve rota izleme talimatlarını sesli olarak bildirmek için sesli rehberliği etkinleştirme
  • Hız çarpanı belirterek hata ayıklama için simülatörü ayarlama.
  1. Hedefiniz olarak kullanacağınız bir yer kimliği bulun. İdeal olarak bu konum, kullanıcının konumundan çok uzak olmamalıdır. Google Haritalar Platformu Place ID Finder yardımcı programını kullanın veya Places API çağrısından bir Place ID alın.

Geçişi simüle ediyorsanız kullanıcı konumunu kodda ayarlayabilir veya bağlı cihazınızdan alabilirsiniz. Bu codelab'de, Birleşik Krallık'taki Londra'da bir konumu simüle ettiğiniz varsayılacaktır.

  1. Başlangıç konumunu ve yer kimliğini depolamak için MainActivity sınıfınıza bir yardımcı nesne ekleyin. Codelab'de Londra'da bir başlangıç konumu ve Trafalgar Meydanı'nın yer kimliği kullanılacak:
companion object{
   const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
   val startLocation = LatLng(51.345678, -0.1234456)
}
  1. navigateToPlace() yönteminizden initializeNavigationApi yöntemi içindeki onNavigatorReady geri çağırma işlevine bir çağrı ekleyin ve kullanıcı konumunu ayarlayan, hata ayıklama modunda yürütülecek 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 Navigation SDK'nın kullanım şartlarını kabul etmeniz gerekir.

Not: Uygulamanın çalıştırılması, setDestinations() yönteminin çağrılmasına neden olur. Bu yöntem, kullanılan ilk 1.000 hedeften sonra ücretlendirilir. Daha fazla bilgi için Kullanım ve faturalandırma başlıklı makaleyi inceleyin.

93aa433000a14dfc.png

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

Konumu ayarlama

Kodda veya emülatör özellikleri iletişim kutusunu kullanarak bir konum ayarlamadığınız sürece, emüle edilen cihazın konumu varsayılan olarak Mountain View, Kaliforniya'daki Google kampüsü olarak ayarlanabilir.

Bu durumda, uygulamanın yapılandırdığınız Yer Kimliğine (varsayılan olarak Sidney Opera Binası, Sidney, Avustralya) giden bir rota bulamadığını görebilirsiniz. Bu durum, showToast() yönteminiz tarafından gösterilen "Rota bulunamadı" mesajıyla belirtilir.

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 dosyasındaki navigateToPlace() yöntemine mNavigator.startGuidance() çağrısından önce aşağıdaki satırı ekleyin:

mNavigator?.simulator?.setUserLocation(startLocation)

Emülatörü istediğiniz varsayılan 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ş Kontroller" ipucunu içeren 3 nokta menüsünü tıklayın. Açılan iletişim kutusunda "Konum" 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ı"nı arayın, bir öneri seçin ve iletişim kutusunun sağ alt kısmındaki "Konumu Kaydet"i tıklayın. Konumu ileride kullanmak üzere kayıtlı bir listeye eklemek için "Noktayı Kaydet"i de tıklayabilirsiniz.

Android Cihaz Yöneticisi&#39;ndeki Genişletilmiş Kontroller iletişim kutusunda, Avustralya&#39;daki Bondi Plajı&#39;nın ortalandığı bir yer seçici ve harita gösteriliyor.

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ı amacıyla bu yer kimliğinin yakınında bir konum seçin.

Uygulamayı yeniden başlattığınızda hedef konuma yönlendirilirsiniz.

Hedefle ilgili yol tarifi veren Navigasyon uygulamasının ekran görüntüsü.

11. Tebrikler!

Bu codelab'i tamamlamış olmanız gerekir. Bravo, hedefinize ulaştınız. Keyifli kodlamalar :-)

55812f33256c0596.png

12. İşi daha ileri taşıma

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