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.

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

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.

Ü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.
- Android Studio'ya Hoş Geldiniz iletişim kutusunda Aç düğmesini tıklayın.
- Klonlanan depoyu kaydettiğiniz klasöre gidin ve üst düzey "
codelab-navigation-101-android-kotlin" klasörünün içindekiStarterklasörünü seçin. - 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:

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.
- Dosyayı açın ve Kod görünümüne geçin.
- Dosyanın tüm içeriğini, aşağıdaki örnekte olduğu gibi
RelativeLayoutiçindeNavigationViewöğ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. - 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:
MainActivitysınıfınızdaNavigationViewöğenize referans veren bir değişken tanımlayın:
private lateinit var navView: NavigationView
onCreate()yöntemine,NavigationViewöğenize referans almak için kod ekleyin:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
- 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)
ViewCompat.setOnApplyWindowInsetsListeneriş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
}
- 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:
MainActivitysı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
- Navigator başlatıldığında işleyicileri ayarlamak için
registerNavigationListeners()yöntemi ekleyin. Bu yöntem, varış etkinliği tetiklendiğindeNavigationViewdeğerini sıfırlamak içinNavigator.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)
}
}
initializeNavigationApiyöntemindekionNavigatorReadygeri çağırma kodundanregisterNavigationListeners()öğ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()
}
- 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.
onNavigatorReadyiçinde döndürülennavigatornesnesininsetTaskRemovedBehaviouryö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)
CameraPerspectivebelirtmek içinGoogleMap.followMyLocationnumarası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)
}
- Uygulama yaşam döngüsü boyunca gezinme işlevlerinin sorunsuz çalışmasını sağlamak için
MainActivitysı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:
- Geçiş hedefini ayarlayan ve
placeIdparametresini kabul eden yeni birnavigateToPlace()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) {
}
navigateToPlace()yönteminizde, yönteme iletilen yer kimliğindenWaypointoluşturmak içinWaypoint.builder()yöntemini kullanın. Yer Kimliğinin kesin bir adrese çözümlenmediği durumlarda bu işlemin hata verebileceğiUnsupportedPlaceIdExceptiondeğ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
}
- 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.
- 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.
- 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.
- Başlangıç konumunu ve yer kimliğini depolamak için
MainActivitysı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)
}
navigateToPlace()yönteminizdeninitializeNavigationApiyöntemi içindekionNavigatorReadygeri ç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.


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.

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.

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.

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

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.
- Daha fazla gezinme etkinliğini dinleyin. Sürücü rotayı değiştirdiğinde veya varış noktasına ulaştığında mesaj göstermek için kod ekleyin.
- Gezinme arayüzünü özelleştirme
- Daha büyük bir zorluk istiyorsanız kullanıcının hedefi ayarlamasına izin vermek için Places API Yer Seçici denetimi ekleyip ekleyemeyeceğinize bakın. İpucu: GitHub'daki Navigation SDK demo uygulamalarında örnek bir uygulama bulunur.
- GitHub'daki Navigasyon SDK'sı demo uygulamalarında kullanılan yaklaşımı benimseyerek Navigator ve GoogleMap nesnelerinin eşzamansız olarak çağrılmasıyla ilgili olası sorunları önleyin. Daha karmaşık uygulama senaryolarında, kodunuz çalışırken bu nesnelerin başlatılması tamamlanmamış olabilir. İpucu: Çok hızlı bir uygulama için InitializedNavScope sınıfını MainActivity.kt dosyanızın sonuna ekleyebilirsiniz.