Kotlin 04.1'de gelişmiş Android: Android Google Haritalar

Bu codelab, Advanced Android in Kotlin kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla incelemeniz önerilir ancak bu zorunlu değildir. Kursla ilgili tüm codelab'ler Kotlin'de İleri Düzey Android codelab'leri açılış sayfasında listelenir.

Google Haritalar ile uygulama oluşturmak, uygulamanıza uydu görüntüleri, haritalar için güçlü kullanıcı arayüzü kontrolleri, konum takibi ve konum işaretçileri gibi özellikler eklemenize olanak tanır. Kendi veri kümenizdeki bilgileri (ör. iyi bilinen balık tutma veya tırmanma alanlarının konumları) göstererek standart Google Haritalar'a değer katabilirsiniz. Ayrıca, oyuncunun fiziksel dünyayı keşfettiği oyunlar da oluşturabilirsiniz. Örneğin, hazine avı veya artırılmış gerçeklik oyunları.

Bu derste, özelleştirilmiş haritalar gösteren ve kullanıcının konumunu belirten Wander adlı bir Google Haritalar uygulaması oluşturacaksınız.

Ön koşullar

Aşağıdaki konularda bilgi sahibi olmanız gerekir:

  • Temel bir Android uygulaması oluşturma ve Android Studio'yu kullanarak çalıştırma
  • Dizeler gibi kaynakları oluşturma ve yönetme
  • Android Studio'yu kullanarak kodu yeniden düzenleme ve değişkenleri yeniden adlandırma
  • Google Haritası'nı kullanıcı olarak kullanma
  • Çalışma zamanı izinlerini ayarlama

Neler öğreneceksiniz?

  • Google API Konsolu'ndan API anahtarı alma ve anahtarı uygulamanıza kaydetme
  • Uygulamanıza Google Haritası entegre etme
  • Farklı harita türlerini görüntüleme
  • Google Haritası'nı stilize etme
  • Haritanıza işaretçi ekleme
  • Kullanıcının ilgi çekici bir noktaya (ÖY) işaretçi yerleştirmesini sağlama
  • Konum izlemeyi etkinleştirme
  • Yerleştirilmiş Google Haritası olan Wander uygulamasını oluşturma
  • Uygulamanız için işaretçiler ve stil gibi özel özellikler oluşturma
  • Uygulamanızda konum izlemeyi etkinleştirme

Bu codelab'de, özel stil içeren bir Google Haritası görüntüleyen Wander uygulamasını oluşturacaksınız. Wander uygulaması, konumlara işaretçi bırakmanıza, yer paylaşımları eklemenize ve konumunuzu gerçek zamanlı olarak görmenize olanak tanır.

Android için Haritalar SDK'sı için API anahtarı gerekir. API anahtarını almak için projenizi API'ler ve Hizmetler sayfasında kaydedin. API anahtarı, uygulamayı yazarına bağlayan bir dijital sertifikaya bağlıdır. Dijital sertifikaları kullanma ve uygulamanızı imzalama hakkında daha fazla bilgi için Uygulamanızı imzalama başlıklı makaleyi inceleyin.

Bu codelab'de hata ayıklama sertifikası için API anahtarını kullanırsınız. Hata ayıklama sertifikası, Hata ayıklama derlemenizi imzalama bölümünde açıklandığı gibi tasarım gereği güvenli değildir. Android için Haritalar SDK'sını kullanan yayınlanmış Android uygulamaları için ikinci bir API anahtarı gerekir: yayın sertifikasının anahtarı. Yayın sertifikası alma hakkında daha fazla bilgi için API anahtarı edinme başlıklı makaleyi inceleyin.

Android Studio'da, faydalı şablon kodu oluşturan bir Google Haritalar Etkinliği şablonu bulunur. Şablon kodu, API anahtarı edinmeyi kolaylaştıran bir bağlantı içeren google_maps_api.xml dosyası içerir.

1. adım: Haritalar şablonuyla Gezgin projesi oluşturun

  1. Yeni bir Android Studio projesi oluşturun.
  2. Google Haritalar Etkinliği şablonunu seçin.

  1. Projeyi adlandırın Wander.
  2. Minimum API düzeyini API 19 olarak ayarlayın. Dilin Kotlin olduğundan emin olun.
  3. Son'u tıklayın.
  4. Uygulama oluşturma işlemi tamamlandıktan sonra projenize ve Android Studio'nun sizin için oluşturduğu haritalarla ilgili aşağıdaki dosyalara göz atın:

google_maps_api.xml: API anahtarınızı tutmak için bu yapılandırma dosyasını kullanırsınız. Şablon, biri hata ayıklama, diğeri yayın için olmak üzere iki google_maps_api.xml dosyası oluşturur. Hata ayıklama sertifikasının API anahtarı dosyası src/debug/res/values içinde bulunur. Yayın sertifikasının API anahtarı dosyası src/release/res/values içinde bulunur. Bu codelab'de yalnızca hata ayıklama sertifikasını kullanacaksınız.

activity_maps.xml: Bu düzen dosyası, ekranın tamamını dolduran tek bir parça içerir. SupportMapFragment sınıfı, Fragment sınıfının alt sınıfıdır. SupportMapFragment, bir uygulamaya harita yerleştirmenin en basit yoludur. Gerekli yaşam döngüsü ihtiyaçlarını otomatik olarak karşılamak için harita görünümünün etrafındaki bir sarmalayıcıdır.

Ek bir name özelliğiyle birlikte herhangi bir ViewGroup içinde <fragment> etiketi kullanarak bir düzen dosyasına SupportMapFragment ekleyebilirsiniz.

android:name="com.google.android.gms.maps.SupportMapFragment"

MapsActivity.java: MapsActivity.kt dosyası, onCreate() yönteminde SupportMapFragment öğesini oluşturur ve harita sistemini ve görünümü otomatik olarak başlatmak için sınıfın getMapAsync() öğesini kullanır. SupportMapFragment öğesini içeren etkinlik, OnMapReadyCallback arayüzünü ve bu arayüzün onMapReady() yöntemini uygulamalıdır. Harita yüklendiğinde onMapReady() yöntemi çağrılır.

2. adım: API anahtarını alın

  1. google_maps_api.xml dosyasının hata ayıklama sürümünü açın.
  2. Dosyada uzun URL'li bir yorum bulun. URL'nin parametreleri, uygulamanızla ilgili belirli bilgileri içerir.
  3. URL'yi kopyalayıp bir tarayıcıya yapıştırın.
  4. API'ler ve Hizmetler sayfasında proje oluşturmak için istemleri uygulayın. Sağlanan URL'deki parametreler nedeniyle sayfa, Android için Haritalar SDK'sını otomatik olarak etkinleştirmesi gerektiğini bilir.
  5. API anahtarı oluştur'u tıklayın.
  6. Sonraki sayfada API Anahtarları bölümüne gidin ve yeni oluşturduğunuz anahtarı tıklayın.
  7. Anahtarı Kısıtla'yı tıklayın ve anahtarın kullanımını Android uygulamalarıyla kısıtlamak için Android için Haritalar SDK'sı'nı seçin.
  8. Oluşturulan API anahtarını kopyalayın. "AIza"" ile başlar.
  9. google_maps_api.xml dosyasında, anahtarı YOUR_KEY_HERE yazan google_maps_key dizesine yapıştırın.
  10. Uygulamanızı çalıştırın. Etkinliğinizde, Avustralya'nın Sidney şehrinde işaretlenmiş bir yer işareti içeren yerleştirilmiş bir harita görmelisiniz. (Sydney işaretçisi şablonun bir parçasıdır ve daha sonra değiştirebilirsiniz.)

3. adım: mMap'i yeniden adlandırın

MapsActivity, GoogleMap türünde olan mMap adlı özel bir lateinit var içerir. Kotlin adlandırma kurallarına uymak için mMap adını map olarak değiştirin.

  1. MapsActivity bölümünde, mMap öğesini sağ tıklayın ve Yeniden düzenle > Yeniden adlandır...'ı tıklayın.

  1. Değişken adını map olarak değiştirin.

onMapReady() işlevindeki tüm mMap referanslarının da map olarak değiştiğine dikkat edin.

Google Haritalar'da normal, karma, uydu, arazi ve "yok" (hiç harita yok) olmak üzere çeşitli harita türleri bulunur.

Normal harita

Uydu haritası

Karma harita

Arazi haritası

Her harita türü farklı bilgiler sağlar. Örneğin, arabada navigasyon için haritaları kullanırken sokak adlarını görmek faydalı olur. Bu nedenle normal seçeneğini kullanabilirsiniz. Doğa yürüyüşü yaparken arazi haritası, zirveye ulaşmak için ne kadar daha tırmanmanız gerektiğine karar vermenize yardımcı olabilir.

Bu görevde şunları yapacaksınız:

  1. Kullanıcının harita türünü değiştirmesine olanak tanıyan bir seçenekler menüsü içeren uygulama çubuğu ekleyin.
  2. Haritanın başlangıç konumunu kendi evinizin bulunduğu konuma taşıyın.
  3. Haritada tek konumları gösteren ve etiket içerebilen işaretçiler için destek ekleyin.

Harita türleri için menü ekleme

Bu adımda, kullanıcının harita türünü değiştirmesine olanak tanıyan bir seçenekler menüsü içeren bir uygulama çubuğu ekleyeceksiniz.

  1. Yeni bir menü XML dosyası oluşturmak için res dizininizi sağ tıklayın ve Yeni > Android Kaynak Dosyası'nı seçin.
  2. İletişim kutusunda dosyaya ad verin map_options.
  3. Kaynak türü olarak Menü'yü seçin.
  4. Tamam'ı tıklayın.
  5. Kod sekmesinde, yeni dosyadaki kodu aşağıdaki kodla değiştirerek harita menüsü seçeneklerini oluşturun. "Hiçbiri" harita türü, "hiçbiri" seçildiğinde harita olmamasıyla sonuçlandığı için atlanır. Bu adımda bir hata oluşur ancak bir sonraki adımda bu hatayı çözersiniz.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/normal_map"
       android:title="@string/normal_map"
       app:showAsAction="never" />
   <item
       android:id="@+id/hybrid_map"
       android:title="@string/hybrid_map"
       app:showAsAction="never" />
   <item
       android:id="@+id/satellite_map"
       android:title="@string/satellite_map"
       app:showAsAction="never" />
   <item
       android:id="@+id/terrain_map"
       android:title="@string/terrain_map"
       app:showAsAction="never" />
</menu>
  1. strings.xml bölümünde, hataları düzeltmek için title özellikleriyle ilgili kaynaklar ekleyin.
<resources>
   ...
   <string name="normal_map">Normal Map</string>
   <string name="hybrid_map">Hybrid Map</string>
   <string name="satellite_map">Satellite Map</string>
   <string name="terrain_map">Terrain Map</string>
   <string name="lat_long_snippet">Lat: %1$.5f, Long: %2$.5f</string>
   <string name="dropped_pin">Dropped Pin</string>
   <string name="poi">poi</string>
</resources>
  1. MapsActivity içinde onCreateOptionsMenu() yöntemini geçersiz kılın ve menüyü map_options kaynak dosyasından genişletin.
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
   val inflater = menuInflater
   inflater.inflate(R.menu.map_options, menu)
   return true
}
  1. MapsActivity.kt içinde onOptionsItemSelected() yöntemini geçersiz kılın. Kullanıcının seçimini yansıtmak için map-type sabitlerini kullanarak harita türünü değiştirin.
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
   // Change the map type based on the user's selection.
   R.id.normal_map -> {
       map.mapType = GoogleMap.MAP_TYPE_NORMAL
       true
   }
   R.id.hybrid_map -> {
       map.mapType = GoogleMap.MAP_TYPE_HYBRID
       true
   }
   R.id.satellite_map -> {
       map.mapType = GoogleMap.MAP_TYPE_SATELLITE
       true
   }
   R.id.terrain_map -> {
       map.mapType = GoogleMap.MAP_TYPE_TERRAIN
       true
   }
   else -> super.onOptionsItemSelected(item)
}
  1. Uygulamayı çalıştırın.
  2. Harita türünü değiştirmek için simgesini tıklayın. Haritanın görünümünün farklı modlarda nasıl değiştiğine dikkat edin.

Varsayılan olarak onMapReady() geri çağırma işlevi, Google Haritalar'ın oluşturulduğu yer olan Sidney, Avustralya'ya bir işaretçi yerleştiren kodu içerir. Varsayılan geri çağırma, haritayı Sidney'e kaydıracak şekilde de animasyonlandırır.

Bu görevde, haritanın kamerasını evinize taşıyacak, belirttiğiniz seviyede yakınlaştıracak ve oraya bir işaretçi yerleştireceksiniz.

1. adım: Evinize yakınlaştırın ve işaretçi ekleyin

  1. MapsActivity.kt dosyasında onMapReady() yöntemini bulun. İşaretçiyi Sidney'e yerleştiren ve kamerayı hareket ettiren kodu kaldırın. Yönteminiz artık aşağıdaki gibi görünmelidir.
override fun onMapReady(googleMap: GoogleMap) {
   map = googleMap

}
  1. Bu talimatları uygulayarak evinizin enlemini ve boylamını bulun.
  2. Enlem ve boylam için bir değer oluşturun ve bunların kayan nokta değerlerini girin.
val latitude = 37.422160
val longitude = -122.084270
  1. homeLatLng adlı yeni bir LatLng nesnesi oluşturun. homeLatLng nesnesinde, yeni oluşturduğunuz değerleri iletin.
val homeLatLng = LatLng(latitude, longitude)
  1. Haritada ne kadar yakınlaştırmak istediğinize dair bir val oluşturun. 15f yakınlaştırma düzeyini kullanın.
val zoomLevel = 15f

Yakınlaştırma düzeyi, haritayı ne kadar yakınlaştırdığınızı kontrol eder. Aşağıdaki listede, her yakınlaştırma düzeyinde gösterilen ayrıntı düzeyi hakkında bilgi verilmektedir:

  • 1: Dünya
  • 5: Karalar/kıta
  • 10: Şehir
  • 15: Sokaklar
  • 20: Binalar
  1. map nesnesinde moveCamera() işlevini çağırarak ve CameraUpdateFactory.newLatLngZoom() kullanarak CameraUpdate nesnesi ileterek kamerayı homeLatLng konumuna getirin. homeLatLng nesnesini ve zoomLevel değerini iletin.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
  1. Haritaya homeLatLng konumunda bir işaretçi ekleyin.
map.addMarker(MarkerOptions().position(homeLatLng))

Son yönteminiz aşağıdaki gibi görünmelidir:

override fun onMapReady(googleMap: GoogleMap) {
   map = googleMap

   //These coordinates represent the latitude and longitude of the Googleplex.
   val latitude = 37.422160
   val longitude = -122.084270
   val zoomLevel = 15f

   val homeLatLng = LatLng(latitude, longitude)
   map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
   map.addMarker(MarkerOptions().position(homeLatLng))
}
  1. Uygulamanızı çalıştırın. Harita, evinize doğru kaymalı, istenen düzeye yakınlaşmalı ve evinize bir işaretçi yerleştirmelidir.

2. adım: Kullanıcıların uzun tıklama ile işaretçi eklemesine izin verin

Bu adımda, kullanıcı haritada bir konuma dokunup basılı tuttuğunda işaretçi ekliyorsunuz.

  1. MapsActivity içinde setMapLongClick() adlı bir yöntem saplaması oluşturun. Bu yöntem, bağımsız değişken olarak GoogleMap alır.
  2. Harita nesnesine setOnMapLongClickListener dinleyici ekleyin.
private fun setMapLongClick(map:GoogleMap) {
   map.setOnMapLongClickListener { }
}
  1. setOnMapLongClickListener() içinde addMarker() yöntemini çağırın. Konumu, iletilen LatLng olarak ayarlanmış yeni bir MarkerOptions nesnesi iletin.
private fun setMapLongClick(map: GoogleMap) {
   map.setOnMapLongClickListener { latLng ->
       map.addMarker(
           MarkerOptions()
               .position(latLng)
       )
   }
}
  1. onMapReady() yönteminin sonunda map ile setMapLongClick()'ı arayın.
override fun onMapReady(googleMap: GoogleMap) {
   ...
  
   setMapLongClick(map)
}
  1. Uygulamanızı çalıştırın.
  2. Bir konuma işaretçi yerleştirmek için haritaya dokunup basılı tutun.
  3. İşaretçiye dokunarak ekranın ortasına getirin.

3. adım: İşaretçi için bir bilgi penceresi ekleyin

Bu adımda, işaretçiye dokunulduğunda işaretçinin koordinatlarını gösteren bir InfoWindow ekleyeceksiniz.

  1. setMapLongClick()setOnMapLongClickListener() içinde snippet için val oluşturun. Snippet, başlıktan sonra gösterilen ek metindir. Snippet'inizde bir işaretçinin enlemi ve boylamı gösterilir.
private fun setMapLongClick(map: GoogleMap) {
   map.setOnMapLongClickListener { latLng ->
       // A snippet is additional text that's displayed after the title.
       val snippet = String.format(
           Locale.getDefault(),
           "Lat: %1$.5f, Long: %2$.5f",
           latLng.latitude,
           latLng.longitude
       )
       map.addMarker(
           MarkerOptions()
               .position(latLng)
       )
   }
}
  1. addMarker() içinde, R.string.dropped_pin dize kaynağını kullanarak işaretçinin title değerini "Bırakılan İşaret" olarak ayarlayın.
  2. İşaretçinin snippet değerini snippet olarak ayarlayın.

Tamamlanan işlev şu şekilde görünür:

private fun setMapLongClick(map: GoogleMap) {
   map.setOnMapLongClickListener { latLng ->
       // A Snippet is Additional text that's displayed below the title.
       val snippet = String.format(
           Locale.getDefault(),
           "Lat: %1$.5f, Long: %2$.5f",
           latLng.latitude,
           latLng.longitude
       )
       map.addMarker(
           MarkerOptions()
               .position(latLng)
               .title(getString(R.string.dropped_pin))
               .snippet(snippet)
              
       )
   }
}
  1. Uygulamanızı çalıştırın.
  2. Konum işaretçisi bırakmak için haritaya dokunup basılı tutun.
  3. Bilgi penceresini göstermek için işaretçiye dokunun.

4. adım: Öİ dinleyici ekleyin

Varsayılan olarak, ilgi çekici yerler (İÇY'ler) haritada ilgili simgeleriyle birlikte gösterilir. Önemli yerler arasında parklar, okullar, devlet binaları ve daha fazlası yer alır. Harita türü normal olarak ayarlandığında işletme ÖY'leri de haritada görünür. İşletme ÖY'leri, mağazalar, restoranlar ve oteller gibi işletmeleri temsil eder.

Bu adımda, haritaya GoogleMap.OnPoiClickListener ekleyeceksiniz. Bu tıklama işleyicisi, kullanıcı bir ÖY'yi tıkladığında haritaya hemen bir işaretçi yerleştirir. Tıklama işleyicisi, ilgi alanının adını içeren bir bilgi penceresi de gösterir.

  1. MapsActivity içinde setPoiClick() adlı bir yöntem saplaması oluşturun. Bu yöntem, bağımsız değişken olarak GoogleMap alır.
  2. setPoiClick() yönteminde, iletilen GoogleMap üzerinde bir OnPoiClickListener ayarlayın.
private fun setPoiClick(map: GoogleMap) {
   map.setOnPoiClickListener { poi ->

   }
}
  1. setOnPoiClickListener() içinde işaretçi için bir val poiMarker oluşturun .
  2. map.addMarker() ile MarkerOptions kullanarak önemli yerin adını title olarak ayarlayın.
private fun setPoiClick(map: GoogleMap) {
   map.setOnPoiClickListener { poi ->
       val poiMarker = map.addMarker(
           MarkerOptions()
               .position(poi.latLng)
               .title(poi.name)
       )
   }
}
  1. setOnPoiClickListener() işlevinde, bilgi penceresini hemen göstermek için poiMarker üzerinde showInfoWindow() işlevini çağırın.
poiMarker.showInfoWindow()

setPoiClick() işlevi için son kodunuz aşağıdaki gibi görünmelidir.

private fun setPoiClick(map: GoogleMap) {
   map.setOnPoiClickListener { poi ->
       val poiMarker = map.addMarker(
           MarkerOptions()
               .position(poi.latLng)
               .title(poi.name)
       )
       poiMarker.showInfoWindow()
   }
}
  1. onMapReady() sonunda setPoiClick() numaralı telefonu arayıp map kodunu girin.
override fun onMapReady(googleMap: GoogleMap) {
   ...

   setPoiClick(map)
}
  1. Uygulamanızı çalıştırın ve park veya kafe gibi bir ÖY bulun.
  2. Üzerine işaretçi yerleştirmek ve ilgi alanının adını bilgi penceresinde göstermek için ilgi alanına dokunun.

Google Haritalar'ı birçok şekilde özelleştirerek haritanıza benzersiz bir görünüm ve tarz katabilirsiniz.

Diğer tüm parçaları özelleştirdiğiniz gibi, mevcut XML özelliklerini kullanarak MapFragment nesnesini özelleştirebilirsiniz. Ancak bu adımda, GoogleMap nesnesindeki yöntemleri kullanarak MapFragment içeriğinin görünümünü ve tarzını özelleştirirsiniz.

Haritanız için özelleştirilmiş bir stil oluşturmak üzere, haritadaki özelliklerin nasıl görüntüleneceğini belirten bir JSON dosyası oluşturursunuz. Bu JSON dosyasını manuel olarak oluşturmanız gerekmez. Google, haritanızı görsel olarak şekillendirdikten sonra sizin için JSON oluşturan Haritalar Platformu Stil Sihirbazı'nı sunar. Bu görevde, haritayı retro temayla şekillendiriyorsunuz. Yani haritada eski renkler kullanılıyor ve renkli yollar ekliyorsunuz.

1. adım: Haritanız için stil oluşturun

  1. Tarayıcınızda https://mapstyle.withgoogle.com/ adresine gidin.
  2. Stil Oluştur'u seçin.
  3. Retro'yu seçin.

  1. Diğer Seçenekler öğesini tıklayın.

  1. Özellik türü listesinde Yol > Doldur'u seçin.
  2. Yolların rengini istediğiniz renkle (ör. pembe) değiştirin.

  1. Son'u tıklayın.

  1. Sonuçta elde edilen iletişim kutusundaki JSON kodunu kopyalayın ve isterseniz bir sonraki adımda kullanmak üzere düz metin notuna yapıştırın.

2. adım: Stili haritanıza ekleyin

  1. Android Studio'da res dizininde bir kaynak dizini oluşturun ve raw olarak adlandırın. raw dizin kaynaklarını JSON kodu gibi kullanırsınız.
  2. res/raw içinde map_style.json adlı bir dosya oluştur.
  3. Saklanan JSON kodunuzu yeni kaynak dosyasına yapıştırın.
  4. MapsActivity içinde, onCreate() yönteminin üzerinde bir TAG sınıf değişkeni oluşturun. Bu, günlük kaydı amacıyla kullanılır.
private val TAG = MapsActivity::class.java.simpleName
  1. Ayrıca MapsActivity içinde, GoogleMap alan bir setMapStyle() işlevi oluşturun.
  2. setMapStyle() bölümüne try{} bloğu ekleyin.
  3. try{} bloğunda, stilin başarılı olması için val success oluşturun. (Aşağıdaki catch bloğunu eklersiniz.)
  4. try{} bloğunda, JSON stilini haritaya ayarlayın ve GoogleMap nesnesinde setMapStyle() işlevini çağırın. JSON dosyasını yükleyen bir MapStyleOptions nesnesi iletin.
  5. Sonucu success adlı kullanıcıya atayın. setMapStyle() yöntemi, stil dosyasının ayrıştırılmasının ve stilin ayarlanmasının başarı durumunu gösteren bir boole değeri döndürür.
private fun setMapStyle(map: GoogleMap) {
   try {
       // Customize the styling of the base map using a JSON object defined
       // in a raw resource file.
       val success = map.setMapStyle(
           MapStyleOptions.loadRawResourceStyle(
               this,
               R.raw.map_style
           )
       )
   }
}
  1. success değerinin yanlış olması için bir if ifadesi ekleyin. Stil oluşturma başarısız olursa ayrıştırmanın başarısız olduğuna dair bir günlük yazdırın.
private fun setMapStyle(map: GoogleMap) {
   try {
       ...
       if (!success) {
           Log.e(TAG, "Style parsing failed.")
       }
   }
}
  1. Eksik stil dosyası durumunu ele almak için catch{} bloğu ekleyin. catch bloğunda, dosya yüklenemiyorsa Resources.NotFoundException oluşturun.
private fun setMapStyle(map: GoogleMap) {
   try {
       ...
   } catch (e: Resources.NotFoundException) {
       Log.e(TAG, "Can't find style. Error: ", e)
   }
}

Tamamlanmış yöntem aşağıdaki kod snippet'i gibi görünmelidir:

private fun setMapStyle(map: GoogleMap) {
   try {
       // Customize the styling of the base map using a JSON object defined
       // in a raw resource file.
       val success = map.setMapStyle(
           MapStyleOptions.loadRawResourceStyle(
               this,
               R.raw.map_style
           )
       )

       if (!success) {
           Log.e(TAG, "Style parsing failed.")
       }
   } catch (e: Resources.NotFoundException) {
       Log.e(TAG, "Can't find style. Error: ", e)
   }
}
  1. Son olarak, setMapStyle() yöntemini onMapReady() yönteminde GoogleMap nesnenizi ileterek çağırın.
override fun onMapReady(googleMap: GoogleMap) {
   ...
   setMapStyle(map)
}
  1. Uygulamanızı çalıştırın.
  2. Haritayı normal moduna ayarladığınızda yeni stil, retro teması ve seçtiğiniz renkteki yollarla birlikte görünür.

3. adım: İşaretçinizin stilini belirleyin

Harita işaretçilerine stil vererek haritanızı daha da kişiselleştirebilirsiniz. Bu adımda, varsayılan kırmızı işaretçileri daha eğlenceli bir hale getireceksiniz.

  1. onMapLongClick() yönteminde, varsayılan işaretçiyi kullanmak için aşağıdaki kod satırını oluşturucunun MarkerOptions() kısmına ekleyin ancak rengi mavi olarak değiştirin.
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))

Şimdi onMapLongClickListener() şu şekilde görünüyor:

map.setOnMapLongClickListener { latLng ->
   // A snippet is additional text that's displayed after the title.
   val snippet = String.format(
       Locale.getDefault(),
       "Lat: %1$.5f, Long: %2$.5f",
       latLng.latitude,
       latLng.longitude
   )
   map.addMarker(
       MarkerOptions()
           .position(latLng)
           .title(getString(R.string.dropped_pin))
           .snippet(snippet)
         .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
   )
}
  1. Uygulamayı çalıştırın. Uzun tıkladıktan sonra görünen işaretçiler artık mavi renkte gösterilir. onPoiClick() yöntemine stil eklemediğiniz için ÖY işaretçilerinin hâlâ kırmızı olduğunu unutmayın.

Google Haritası'nı özelleştirmenin bir yolu, haritanın üzerine çizim yapmaktır. Bu teknik, popüler balık tutma yerleri gibi belirli bir konum türünü vurgulamak istediğinizde kullanışlıdır.

  • Şekiller: Haritaya çoklu çizgiler, poligonlar ve daireler ekleyebilirsiniz.
  • GroundOverlay Nesneler: Zemin bindirme, haritaya sabitlenmiş bir resimdir. Yer paylaşımları, işaretçilerden farklı olarak ekrana değil, Dünya yüzeyine yönlendirilir. Haritayı döndürme, eğme veya yakınlaştırma, görüntünün yönünü değiştirir. Yer paylaşımları, tek bir görüntüyü haritada belirli bir alana sabitlemek istediğinizde kullanışlıdır.

Adım: Yer paylaşımı ekleme

Bu görevde, evinizin konumuna Android şeklinde bir yer paylaşımı ekleyeceksiniz.

  1. Bu Android görüntüsünü indirip res/drawable klasörüne kaydedin. (Dosya adının android.png olduğundan emin olun.)

  1. onMapReady() içinde, kamerayı evinizin konumuna taşıma çağrısından sonra bir GroundOverlayOptions nesnesi oluşturun.
  2. Nesneyi androidOverlay adlı bir değişkene atayın.
val androidOverlay = GroundOverlayOptions()
  1. İndirilen resim kaynağını kullanarak BitmapDescriptorFactory.fromResource() yöntemini kullanarak BitmapDescriptor nesnesi oluşturun.
  2. Elde edilen BitmapDescriptor nesnesini GroundOverlayOptions nesnesinin image() yöntemine iletin.
val androidOverlay = GroundOverlayOptions()
   .image(BitmapDescriptorFactory.fromResource(R.drawable.android))
  1. İstenen yer paylaşımının metre cinsinden genişliği için float overlaySize oluşturun. Bu örnek için 100f genişliği iyi sonuç verir.

position() yöntemini çağırarak GroundOverlayOptions nesnesinin position özelliğini ayarlayın ve homeLatLng nesnesi ile overlaySize değerini iletin.

val overlaySize = 100f
val androidOverlay = GroundOverlayOptions()
   .image(BitmapDescriptorFactory.fromResource(R.drawable.android))
   .position(homeLatLng, overlaySize)
  1. GoogleMap nesnesinde addGroundOverlay() işlevini çağırın ve GroundOverlayOptions nesnenizi iletin.
map.addGroundOverlay(androidOverlay)
  1. Uygulamayı çalıştırın.
  2. Android görüntüsünü yer paylaşımı olarak görmek için zoomLevel değerini 18f olarak değiştirin.

Kullanıcılar genellikle mevcut konumlarını görmek için Google Haritalar'ı kullanır. Cihaz konumunu haritanızda göstermek için konum verisi katmanını kullanabilirsiniz.

Konum verileri katmanı, haritaya Konumum'u ekler. Kullanıcı düğmeye dokunduğunda harita, cihazın konumuna göre ortalanır. Cihaz sabitse konum mavi nokta, hareket hâlindeyse mavi şerit olarak gösterilir.

Bu görevde konum verileri katmanını etkinleştirirsiniz.

Adım: Konum izinleri isteyin

Google Haritalar'da konum izlemeyi etkinleştirmek için tek bir kod satırı gerekir. Ancak kullanıcının konum izinleri verdiğinden (çalışma zamanı izni modelini kullanarak) emin olmanız gerekir.

Bu adımda konum izinleri istenir ve konum izleme etkinleştirilir.

  1. AndroidManifest.xml dosyasında, FINE_LOCATION izninin zaten mevcut olduğunu doğrulayın. Android Studio, Google Haritalar şablonunu seçtiğinizde bu izni ekledi.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  1. MapsActivity içinde REQUEST_LOCATION_PERMISSION sınıf değişkeni oluşturun.
private val REQUEST_LOCATION_PERMISSION = 1
  1. İzinlerin verilip verilmediğini kontrol etmek için MapsActivity içinde isPermissionGranted() adlı bir yöntem oluşturun. Bu yöntemde, kullanıcının izni verip vermediğini kontrol edin.
private fun isPermissionGranted() : Boolean {
  return ContextCompat.checkSelfPermission(
       this,
      Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
}
  1. Uygulamanızda konum takibini etkinleştirmek için MapsActivity içinde enableMyLocation() adlı bir yöntem oluşturun. Bu yöntem herhangi bir bağımsız değişken almaz ve herhangi bir değer döndürmez. İçeride ACCESS_FINE_LOCATION iznini kontrol edin. İzin verildiyse konum katmanını etkinleştirin. Aksi takdirde izni isteyin.
private fun enableMyLocation() {
   if (isPermissionGranted()) {
       map.isMyLocationEnabled = true 
   }
   else {
       ActivityCompat.requestPermissions(
           this,
           arrayOf<String>(Manifest.permission.ACCESS_FINE_LOCATION),
           REQUEST_LOCATION_PERMISSION
       )
   }
}
  1. Konum katmanını etkinleştirmek için onMapReady() geri arama özelliğini kullanarak enableMyLocation() numaralı telefonu arayın.
override fun onMapReady(googleMap: GoogleMap) {
   ...
   enableMyLocation()
}
  1. onRequestPermissionsResult() yöntemini geçersiz kılın. requestCode, REQUEST_LOCATION_PERMISSION değerine eşitse izin verilir ve grantResults dizisi boş değilse ve ilk yuvasında PackageManager.PERMISSION_GRANTED varsa enableMyLocation() çağrılır.
override fun onRequestPermissionsResult(
   requestCode: Int,
   permissions: Array<String>,
   grantResults: IntArray) {
   if (requestCode == REQUEST_LOCATION_PERMISSION) {
       if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
           enableMyLocation()
       }
   }
}
  1. Uygulamanızı çalıştırın. Cihazın konumuna erişim isteğinde bulunan bir iletişim kutusu gösterilmelidir. İzni verin.

Haritada artık cihazın mevcut konumu mavi bir nokta ile gösteriliyor. Konum düğmesi olduğunu unutmayın. Haritayı konumunuzdan uzağa taşıyıp bu düğmeyi tıklarsanız harita tekrar cihazın konumuna ortalanır.

Tamamlanmış codelab'in kodunu indirin.

$  git clone https://github.com/googlecodelabs/android-kotlin-geo-maps


Alternatif olarak, depoyu zip dosyası olarak indirebilir, dosyayı açıp Android Studio'da açabilirsiniz.

Zip dosyasını indir

  • Maps API'yi kullanmak için Google API Konsolu'ndan bir API anahtarı almanız gerekir.
  • Android Studio'da Google Haritalar Etkinliği şablonunu kullanmak, uygulamanın düzeninde tek bir SupportMapFragment içeren bir Activity oluşturur. Şablon, uygulama manifestine ACCESS_FINE_PERMISSION öğesini de ekler, etkinliğinizde OnMapReadyCallback öğesini uygular ve gerekli onMapReady() yöntemini geçersiz kılar.

Çalışma zamanında bir GoogleMap öğesinin harita türünü değiştirmek için GoogleMap.setMapType() yöntemini kullanın. Google Haritası aşağıdaki harita türlerinden biri olabilir:

  • Normal: Normal yol haritası. Yollar, insanlar tarafından inşa edilen bazı yapılar ve nehirler gibi önemli doğal özellikleri gösterir. Yol ve özellik etiketleri de görünür.
  • Karma: Uydu fotoğrafı verilerine yol haritaları eklenir. Yol ve özellik etiketleri de görünür.
  • Uydu: Fotoğraf verileri. Yol ve özellik etiketleri görünmüyor.
  • Arazi: Topografik veriler. Haritada renkler, kontur çizgileri ve etiketler ile perspektif gölgelendirme yer alır. Bazı yollar ve etiketler de görünür.
  • Yok: Temel harita kutuları yok.

Google Haritalar hakkında:

  • İşaretçi, belirli bir coğrafi konumun göstergesidir.
  • İşaretçiye dokunulduğunda varsayılan olarak konumla ilgili bilgilerin yer aldığı bir bilgi penceresi gösterilir.
  • Varsayılan olarak, ilgi çekici yerler (İÇY'ler) temel haritada ilgili simgeleriyle birlikte gösterilir. Önemli yerler arasında parklar, okullar, devlet binaları ve daha fazlası yer alır.
  • Ayrıca, harita türü normal olduğunda işletme ÖY'leri (mağazalar, restoranlar, oteller vb.) varsayılan olarak haritada görünür.
  • OnPoiClickListener kullanarak ÖY'lerdeki tıklamaları yakalayabilirsiniz.
  • Stil Sihirbazı'nı kullanarak Google Haritası'ndaki neredeyse tüm öğelerin görsel görünümünü değiştirebilirsiniz. Stil Sihirbazı, setMapStyle() yöntemini kullanarak Google Harita'ya ilettiğiniz bir JSON dosyası oluşturur.
  • Varsayılan rengi değiştirerek veya varsayılan işaretçi simgesini özel bir resimle değiştirerek işaretçilerinizi özelleştirebilirsiniz.

Diğer önemli bilgiler:

  • Bir resmi coğrafi konuma sabitlemek için yer paylaşımı kullanın.
  • Resmi, resmin metre cinsinden boyutunu ve resmin konumunu belirtmek için GroundOverlayOptions nesnesini kullanın. Yer paylaşımını haritaya ayarlamak için bu nesneyi GoogleMap.addGroundOverlay() yöntemine iletin.
  • Uygulamanızın ACCESS_FINE_LOCATION izni varsa map.isMyLocationEnabled = true ayarını yaparak konum takibini etkinleştirebilirsiniz.
  • Bu codelab'de ele alınmamıştır ancak belirli bir konumun gezilebilir panoramik fotoğrafı olan Google Street View'u kullanarak bir konum hakkında ek bilgiler sağlayabilirsiniz.

Android geliştirici belgeleri:

Referans belgeleri:

Bu kurstaki diğer codelab'lerin bağlantıları için Advanced Android in Kotlin codelab'leri açılış sayfasına bakın.