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.
Ö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.
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.
Ü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.
- Android Studio'ya Hoş Geldiniz iletişim kutusunda Aç düğmesini tıklayın.
- Klonlanmış deposu kaydettiğiniz klasöre gidin ve üst düzey "
codelab-navigation-101-android-kotlin
" klasörünün içindekiStarter
klasörünü seçin. - 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:
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.
- Dosyayı açıp Kod görünümüne geçin.
- Dosyanın tüm içeriğini, aşağıdaki örnekte gösterildiği gibi bir
RelativeLayout
içindeNavigationView
şeklinde yeni bir düzenle değiştirin. Uygulamaya yalnızca bir gezinme görünümü ekleyeceğinizden, basit bir düzen yeterlidir. - 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:
NavigationView
sınıfınızdaNavigationView
'nize referans vermek için bir değişken tanımlayın:
private lateinit var navView: NavigationView
NavigationView
öğenizin referansını almak içinonCreate()
yöntemine bazı kodlar ekleyin:
navView = findViewById(R.id.navigation_view) navView.onCreate(savedInstanceState)
- 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)
NavigationView
öğenizin kimliğini referans olarak almak içinViewCompat.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 }
- 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:
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
- Gezgin başlatıldığında dinleyicileri ayarlamak için bir
registerNavigationListeners()
yöntemi ekleyin. Bu yöntem, Arrival etkinliği tetiklendiğindeNavigationView
değerini sıfırlamak içinNavigator.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) } }
initializeNavigationApi
yöntemindekionNavigatorReady
geri çağırma kodundanregisterNavigationListeners()
adresine bir arama 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. 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ülennavigator
nesnesininsetTaskRemovedBehaviour
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)
CameraPerspective
belirtmek içinGoogleMap.followMyLocation
öğesine bir çağrı ekleyin.GoogleMap
'eNavigatorView.getMapAsync()
yöntemi aracılığıyla aşağıdaki şekilde erişilir:
navView.getMapAsync { googleMap -> googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED) }
- 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:
- Gezinme hedefini ayarlayan ve
placeId
parametresini 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ği'nden birWaypoint
oluşturmak içinWaypoint.builder()
yöntemini kullanın. Yer Kimliği'nin tam adresi çözemediği durumlarda, bunun atabileceğiUnsupportedPlaceIdException
'ı 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 }
- 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.
- 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.
- 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.
- 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) }
initializeNavigationApi
yöntemindekionNavigatorReady
geri çağırma işlevindennavigateToPlace()
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.
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.
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.
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.
11. Tebrikler!
Bu codelab'i tamamladınız. Tebrikler, hedefinize ulaştınız. Keyifli kodlamalar :-)
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.
- Diğer gezinme etkinliklerini dinleyin. Sürücü yeniden rota çizdiğinde veya vardığında mesaj göstermek için kod ekleyin.
- Gezinme arayüzünü özelleştirin.
- Daha büyük bir zorluk istiyorsanız kullanıcının hedefi belirlemesine izin vermek için bir Places API Place Picker denetimi ekleyip ekleyemeyeceğinizi öğrenin. İ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ıştırıldığında bu nesnelerin başlatılması tamamlanmamış olabilir. İpucu: Çok hızlı bir uygulama için MainActivity.kt dosyanızın sonuna InitializedNavScope sınıfını ekleyebilirsiniz.