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

Bu codelab, Kotlin'deki Gelişmiş Android kursuna dahildir. Codelab'ler sırasında sırayla çalıştığınızda bu kurstan en yüksek değeri elde edersiniz ancak zorunlu değildir. Tüm kurs codelab'leri Kotlin Codelab'de Gelişmiş Android açılış sayfasında listelenmiştir.

Google Haritalar ile uygulama oluşturmak, uygulamanıza uydu görüntüleri, haritalar için güçlü kullanıcı arayüzü kontrolleri, konum izleme ve konum işaretçileri gibi özellikler eklemenize olanak sağlar. Kendi veri kümenizden alınan bilgileri (ör. ünlü balıkçılık veya tırmanış bölgeleri gibi) göstererek standart Google Haritalar'a değer katabilirsiniz. Oyuncuların hazine avı, hatta artırılmış gerçeklik oyunları gibi fiziksel dünyayı keşfettiği oyunlar da oluşturabilirsiniz.

Bu derste, Wander adında, özelleştirilmiş haritaları ve kullanıcının konumunu gösteren bir Google Haritalar uygulaması oluşturuyorsunuz.

Ön koşullar

Aşağıdaki konular hakkında bilgi:

  • Temel 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ı kullanıcı olarak nasıl kullanılır?
  • Çalışma zamanı izinleri ayarlama.

Neler öğreneceksiniz?

  • Google API Konsolu'ndan API anahtarı alma ve anahtarı uygulamanıza kaydetme
  • Google Haritalar'ı uygulamanıza entegre etme
  • Farklı harita türleri nasıl görüntülenir?
  • Google Haritalar'ın stilini belirleme
  • Haritanıza işaretçi ekleme
  • Kullanıcının bir önemli noktaya (II) işaretçi yerleştirmesini sağlama
  • Konum izlemeyi etkinleştirme
  • Yerleştirilmiş bir Google Haritası içeren Wander uygulaması nasıl oluşturulur?
  • Uygulamanız için işaretçiler ve stil gibi özel özellikler oluşturma
  • Uygulamanızda konum izlemeyi etkinleştirme

Bu codelab'de, özel stile sahip bir Google haritası görüntüleyen Wander uygulamasını oluşturursunuz. Wander uygulaması, işaretçileri konumlara sürükleyip bırakmanıza, yer paylaşımları eklemenize ve konumunuzu gerçek zamanlı olarak görmenize olanak tanır.

Android için Haritalar SDK'sı bir API anahtarı gerektirir. API anahtarını almak için API & Services sayfasında projenizi kaydedin. API anahtarı, uygulamayı yazarına bağlayan dijital sertifikaya bağlıdır. Dijital sertifikaları kullanma ve uygulamanızı imzalama hakkında daha fazla bilgi edinmek için Uygulamanızı imzalama konusuna bakın.

Bu codelab'de, hata ayıklama sertifikası için API anahtarını kullanırsınız. Hata ayıklama sertifikası tasarım gereği güvenli değildir; Hata ayıklama derlemenizi imzalama bölümünde açıklanmıştır. Android için Haritalar SDK'sını kullanan yayınlanan Android uygulamaları, ikinci bir API anahtarı gerektirir: sürüm sertifikasının anahtarı. Sürüm sertifikası alma hakkında daha fazla bilgi için API Anahtarı alma başlıklı makaleye bakın.

Android Studio, kullanışlı bir şablon kodu oluşturan Google Haritalar Etkinlik şablonu içerir. Şablon kodu, bir API anahtarı alınmasını kolaylaştıran bir bağlantı içeren google_maps_api.xml dosyası içerir.

1. Adım: Haritalar şablonuyla Wander projesini oluşturun

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

  1. Projeye bir ad verin: Wander
  2. Minimum API düzeyini API 19 olarak ayarlayın. Dilin Kotlin olduğundan emin olun.
  3. Son'u tıklayın.
  4. Uygulamanın derlemeyi tamamladıktan sonra projenize ve Android Studio'nun sizin için oluşturduğu haritayla ilgili 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 için, diğeri sürüm için olmak üzere iki google_maps_api.xml dosyası oluşturur. Hata ayıklama sertifikası için API anahtarının dosyası src/debug/res/values konumunda bulunur. Sürüm sertifikasının API anahtarı dosyası src/release/res/values konumunda bulunur. Bu codelab'de yalnızca hata ayıklama sertifikasını kullanıyorsunuz.

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 bir alt sınıfıdır. SupportMapFragment, bir haritaya 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 sarmalayıcısıdır.

Bir SupportMapFragment dosyasına herhangi bir ViewGroup içinde bir <fragment> etiketi kullanarak ve ek bir name özelliğiyle birlikte dosya ekleyebilirsiniz.

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

MapsActivity.java - MapsActivity.kt dosyası, onCreate() yönteminde SupportMapFragment öğesini başlatır ve harita sistemini ve görünümü otomatik olarak başlatmak için sınıfı #getMapAsync() kullanır. SupportMapFragment içeren etkinlik, OnMapReadyCallback arayüzü 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ı edinin

  1. google_maps_api.xml dosyasının hata ayıklama sürümünü açın.
  2. Dosyada uzun URL'si olan bir yorum olup olmadığına bakın. URL parametreleri, uygulamanızla ilgili belirli bilgiler 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 talimatları uygulayın. Sağlanan URL'deki parametreler nedeniyle, sayfa Android için Haritalar SDK'sını otomatik olarak etkinleştireceğini bilir.
  5. API Anahtarı Oluştur'u tıklayın.
  6. Sonraki sayfada API Anahtarları bölümüne gidin ve oluşturduğunuz anahtarı tıklayın.
  7. Anahtarın Android uygulamalarıyla kullanımını kısıtlamak için Anahtarı Kısıtla'yı tıklayın ve 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. Avustralya, Sidney'de ayarlanmış bir işaretçiyle etkinliğinize yerleştirilmiş bir harita göreceksiniz. (Sidney işaretçisi şablonun bir parçasıdır ve daha sonra bunu değiştirirsiniz.)

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

MapsActivity, mMap türünde, GoogleMap türünde olan özel bir lateinit var öğesine sahip. Kotlin adlandırma kurallarını uygulamak için mMap öğesinin adını map olarak değiştirin.

  1. MapsActivity içinde, mMap öğesini sağ tıklayın ve Yeniden düzenle > Yeniden adlandır... seçeneğini tıklayın.

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

onMapReady() işlevindeki mMap öğesine yapılan tüm referansların da map olarak nasıl değiştiğine dikkat edin.

Google Haritalar birkaç harita türü içerir: normal, karma, uydu, arazi ve "hiçbiri" (hiç harita yok).

Normal harita

Uydu haritası

Karma harita

Arazi haritası

Her harita türü farklı türde bilgiler sağlar. Örneğin, bir araçta gezinme için haritaları kullanırken normal adları kullanmak işinize yarayabilir. Doğa yürüyüşü yaparken, zirveye çıkmak için ne kadar tırmanmanız gerektiğine karar verirken arazi haritasından yararlanabilirsiniz.

Bu görevde:

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

Harita türleri için menü ekle

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

  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 dosyayı map_options olarak adlandırın.
  3. Kaynak türü olarak Menü'yü seçin.
  4. Tamam'ı tıklayın.
  5. Harita kodu seçeneklerini oluşturmak için Kod sekmesinde yeni dosyadaki kodu aşağıdaki kodla değiştirin. "Yok" harita türü atlanır, çünkü hiç harita olmamasına neden olur. Bu adım bir hataya neden olur, ancak sonraki adımda bunu çözeceksiniz.
<?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 uygulamasında, hataları çözmek üzere title özellikleri için 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 map_options kaynak dosyasından menüyü 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 harita türü sabit değerlerini 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ı modlar arasında nasıl değiştiğine dikkat edin.

Varsayılan olarak, onMapReady() geri çağırması, Google Haritalar'ın oluşturulduğu Sidney, Avustralya'da bir işaretçi yerleştiren kod içerir. Varsayılan geri arama, Sidney'i kaydırmak için haritayı canlandırır.

Bu görevde haritanın kamerasını evinize taşır, belirttiğiniz seviyeye yakınlaştırır ve oraya bir işaretçi yerleştirirsiniz.

1. Adım: Evinizi yakınlaştırın ve bir 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 şu anda bu şekilde 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şturup hareketli değerleri girin.
val latitude = 37.422160
val longitude = -122.084270
  1. homeLatLng adlı yeni bir LatLng nesnesi oluşturun. homeLatLng nesnesine, yeni oluşturduğunuz değerleri iletin.
val homeLatLng = LatLng(latitude, longitude)
  1. Haritada ne kadar yakınlaştırma yapmak istediğinizi belirlemek için bir val oluşturun. Yakınlaştırma düzeyini kullanın 15f.
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 bir yakınlaştırma düzeyinin hangi ayrıntı düzeyinde gösterildiği hakkında fikir edinebilirsiniz:

  • 1: Dünya
  • 5: Kıta/kıta
  • 10: Şehir
  • 15: Sokaklar
  • 20: Binalar
  1. map nesnesindeki moveCamera() işlevini çağırarak kamerayı homeLatLng alanına taşıyın ve CameraUpdateFactory.newLatLngZoom() değerini kullanarak bir CameraUpdate nesnesi iletin. homeLatLng nesnesini ve zoomLevel öğesini iletin.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
  1. homeLatLng için haritaya bir işaretçi ekleyin.
map.addMarker(MarkerOptions().position(homeLatLng))

Son yönteminiz şöyle 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 kaydırılmalıdır. İstenen konuma yakınlaştırın ve evinize bir işaretçi yerleştirin.

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

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

  1. MapsActivity içinde, GoogleMap olarak bağımsız değişken olarak alınan setMapLongClick() adında bir yöntem saplaması oluşturun.
  2. Harita nesnesine setOnMapLongClickListener işleyicisi ekleyin.
private fun setMapLongClick(map:GoogleMap) {
   map.setOnMapLongClickListener { }
}
  1. setOnMapLongClickListener() içinde addMarker() yöntemini çağırın. Konumun iletildiği LatLng ile yeni bir MarkerOptions nesnesini iletin.
private fun setMapLongClick(map: GoogleMap) {
   map.setOnMapLongClickListener { latLng ->
       map.addMarker(
           MarkerOptions()
               .position(latLng)
       )
   }
}
  1. onMapReady() yönteminin sonunda, map ile setMapLongClick() numaralı telefonu arayın.
override fun onMapReady(googleMap: GoogleMap) {
   ...
  
   setMapLongClick(map)
}
  1. Uygulamanızı çalıştırın.
  2. İşaretçiyi bir konuma yerleştirmek için haritaya dokunup basılı tutun.
  3. İşaretçiyi ekranda ortalayan işaretçiye dokunun.

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örüntüleyen bir InfoWindow eklersiniz.

  1. setMapLongClick()setOnMapLongClickListener() içinde, snippet için bir val oluşturun. Snippet, başlıktan sonra görüntülenen ek metindir. Snippet'iniz bir işaretçinin enlem ve boylamını gösterir.
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ğı kullanarak işaretçinin title değerini Bırakılmış PIN olarak ayarlayın.
  2. İşaretçinin snippet işaretini 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örmek için işaretçiye dokunun.

4. Adım: ÖY işleyicisini ekleyin

Varsayılan olarak, önemli yerler (ÖY'ler) harita üzerinde karşılık gelen simgeleriyle birlikte görünür. ÖY'ler arasında parklar, okullar, hükümet binaları ve daha fazlası yer alır. Harita türü normal olarak ayarlandığında işletme ÖY'leri de haritada görünür. İş ÖY'leri, mağazalar, restoranlar ve oteller gibi işletmeleri temsil eder.

Bu adımda haritaya bir GoogleMap.OnPoiClickListener eklersiniz. Bu tıklama işleyici, bir ÖY'yi tıkladığında haritaya bir işaretçi yerleştirir. Tıklama işleyici, ÖY adını içeren bir bilgi penceresi de gösterir.

  1. MapsActivity içinde, GoogleMap olarak bağımsız değişken olarak alınan setPoiClick() adında bir yöntem saplaması oluşturun.
  2. setPoiClick() yönteminde, iletilen GoogleMap öğesinde bir OnPoiClickListener belirleyin.
private fun setPoiClick(map: GoogleMap) {
   map.setOnPoiClickListener { poi ->

   }
}
  1. setOnPoiClickListener() içinde işaretçi için bir val poiMarker oluşturun .
  2. MarkerOptions kullanarak title kullanarak ÖY adını içeren bir işaretçi 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, poiMarker üzerinde showInfoWindow() işlevini çağırarak bilgi penceresini hemen gösterin.
poiMarker.showInfoWindow()

setPoiClick() işlevi için son kodunuz şu şekilde 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 numarasını girin.
override fun onMapReady(googleMap: GoogleMap) {
   ...

   setPoiClick(map)
}
  1. Uygulamanızı çalıştırıp park yeri veya kafe gibi bir önemli yer bulun.
  2. ÖY'ye dokunarak işaretçiyi yerleştirin ve ÖY'nin adını bilgi penceresinde görüntüleyin.

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

Mevcut bir XML özelliğini kullanarak bir MapFragment nesnesini özelleştirebilirsiniz. Bunun için diğer parçaları özelleştirebilirsiniz. Ancak bu adımda, GoogleMap nesnesindeki yöntemleri kullanarak MapFragment içeriğinin görünümünü ve tarzını özelleştirebilirsiniz.

Haritanıza özelleştirilmiş bir stil oluşturmak için, 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ın stilini belirledikten sonra JSON dosyasını sizin için oluşturan Haritalar Platformu Stil Sihirbazı'nı sunar. Bu görevde haritayı klasik bir temayla şekillendirirsiniz. Diğer bir deyişle, haritada klasik renkler kullanılır ve renkli yollar eklersiniz.

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

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

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

  1. Özellik türü listesinde Yol > Dolgu'yu seçin.
  2. Yolların rengini, seçtiğiniz herhangi bir renkle (pembe gibi) değiştirin.

  1. Son'u tıklayın.

  1. Açılan iletişim kutusunda yer alan JSON kodunu kopyalayın ve isterseniz sonraki adımda kullanmak üzere bir düz metin notunda saklayın.

2. Adım: Stili haritanıza ekleyin

  1. Android Studio'daki res dizininde bir kaynak dizini oluşturup bunu raw olarak adlandırın. JSON kodu gibi raw dizin kaynaklarını kullanıyorsunuz.
  2. res/raw içinde map_style.json adlı bir dosya oluşturun.
  3. Saklanan JSON kodunuzu yeni kaynak dosyasına yapıştırın.
  4. MapsActivity öğesinde onCreate() yönteminin üzerinde bir TAG sınıfı değişkeni oluşturun. Bu, günlük kaydı için kullanılır.
private val TAG = MapsActivity::class.java.simpleName
  1. Ayrıca MapsActivity işlevinde, GoogleMap işlevinde bulunan bir setMapStyle() işlevi oluşturun.
  2. setMapStyle() için try{} bloku ekleyin.
  3. try{} blokunda, stil başarısı için bir val success oluşturun. (Aşağıdaki yakalama bloğunu ekleyin.)
  4. try{} blokunda, JSON stilini haritaya ayarlayın, GoogleMap nesnesinde setMapStyle() çağrısı yapın. JSON dosyasını yükleyen bir MapStyleOptions nesnesini iletin.
  5. Sonucu success adlı kullanıcıya atayın. setMapStyle() yöntemi, stil dosyasını ayrıştırmanın ve stili ayarlamanın başarı durumunu gösteren bir boole 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 için yanlışsa bir"if"ifadesi ekleyin. Stil başarısız olursa ayrıştırmanın başarısız olduğu 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ının durumunu yönetmek için bir catch{} bloku ekleyin. catch bloğunda dosya yüklenemiyorsa Resources.NotFoundException işareti bırakın.
private fun setMapStyle(map: GoogleMap) {
   try {
       ...
   } catch (e: Resources.NotFoundException) {
       Log.e(TAG, "Can't find style. Error: ", e)
   }
}

Tamamlanan 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, onMapReady() yönteminizde GoogleMap nesnenizden geçen setMapStyle() yöntemini çağırın.
override fun onMapReady(googleMap: GoogleMap) {
   ...
   setMapStyle(map)
}
  1. Uygulamanızı çalıştırın.
  2. Haritayı normal moduna ayarlayın. Yeni stil, retro tema ve seçtiğiniz renkteki yollarla görünür olmalıdır.

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

Harita işaretçilerini biçimlendirerek haritanızı daha da kişiselleştirebilirsiniz. Bu adımda varsayılan kırmızı işaretçileri daha güzel bir şeyle değiştirirsiniz.

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

onMapLongClickListener() artık şu şekilde görünür:

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ıklamanızdan sonra görünen işaretçiler artık mavi renktedir. 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, üzerine harita çizmektir. Bu teknik, popüler balık tutma yerleri gibi belirli bir konum türünü vurgulamak istediğinizde yararlıdır.

  • Şekiller: Haritaya poligon, poligon ve daire ekleyebilirsiniz.
  • GroundOverlay nesneler: Zemin yer paylaşımı, haritaya sabitlenmiş bir resimdir. İşaretçilerin aksine, zemin bindirmeleri ekran yerine Google Earth yüzeyine yönlendirilir. Haritayı döndürmek, yatırmak veya yakınlaştırmak resmin yönünü değiştirir. Haritadaki tek bir alanda tek bir resmi düzeltmek istediğinizde zemin bindirmeleri yararlıdır.

Adım: Zemin bindirme

Bu görevde ev konumuna Android biçiminde bir zemin yer paylaşımı eklersiniz.

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

  1. onMapReady() uygulamasında, kamerayı evinizin konumuna taşımak için görüşmeden sonra bir GroundOverlayOptions nesnesi oluşturun.
  2. Nesneyi androidOverlay adlı bir değişkene atayın.
val androidOverlay = GroundOverlayOptions()
  1. İndirilen resim kaynağından BitmapDescriptor nesnesi oluşturmak için BitmapDescriptorFactory.fromResource() yöntemini kullanın.
  2. Oluşturulan BitmapDescriptor nesnesini GroundOverlayOptions nesnesinin image() yöntemine geçirin.
val androidOverlay = GroundOverlayOptions()
   .image(BitmapDescriptorFactory.fromResource(R.drawable.android))
  1. İstediğiniz yer paylaşımına ait metre cinsinden genişlik için bir float overlaySize oluşturun. Bu örnekte, 100f genişliği en iyi sonucu verir.

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

val overlaySize = 100f
val androidOverlay = GroundOverlayOptions()
   .image(BitmapDescriptorFactory.fromResource(R.drawable.android))
   .position(homeLatLng, overlaySize)
  1. GoogleMap nesnesinde addGroundOverlay() öğesini ç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ın mevcut konumlarını görmek için genellikle Google Haritalar'ı kullanması gerekir. Cihazınızın konumunu haritanızda göstermek için konum-veri katmanını kullanabilirsiniz.

Konum verileri katmanı, haritaya Konumum'u ekler. Kullanıcı düğmeye dokunduğunda harita ortalanır. Cihaz hareketsizse konum mavi nokta olarak, hareket ediyorsa mavi nokta olarak gösterilir.

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

Adım: Konum izinlerini isteyin

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

Bu adımda, konum izinlerini istersiniz ve konum izlemeyi etkinleştirirsiniz.

  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 grubunda 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 izlemeyi etkinleştirmek için MapsActivity içinde enableMyLocation() bağımsız değişkeni bulunmayan ve hiçbir şey döndürmeyen bir yöntem oluşturun. İçeride, ACCESS_FINE_LOCATION iznini kontrol edin. İzin verilirse konum katmanını etkinleştirin. Yoksa izin 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 çağırma yönteminden enableMyLocation() numaralı telefonu arayın.
override fun onMapReady(googleMap: GoogleMap) {
   ...
   enableMyLocation()
}
  1. onRequestPermissionsResult() yöntemini geçersiz kılın. requestCode, REQUEST_LOCATION_PERMISSION iznine eşitse ve grantResults dizisi ilk alanında PackageManager.PERMISSION_GRANTED ile boş değilse enableMyLocation() çağrısı yapın.
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 isteyen bir iletişim kutusu olmalıdır. Bunun için sizden izin almanız gerekiyor.

Harita artık mavi geçerli bir nokta kullanarak cihazın geçerli konumunu gösteriyor. Konum düğmesinin bulunduğunu unutmayın. Haritayı konumunuzdan uzaklaştırıp bu düğmeyi tıklarsanız, haritanın konumu cihazın konumuna geri döner.

Tamamlanan codelab'in kodunu indirin.

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


Alternatif olarak, veri havuzunu zip dosyası olarak indirebilir ve sıkıştırılmış dosyayı Android Studio'da açabilirsiniz.

Zip dosyasını indirin

  • Maps API'yi kullanmak için Google API Konsolu'ndan bir API anahtarı gerekir.
  • Android Studio'da Google Haritalar Etkinlik şablonunu kullandığınızda, uygulama düzeninde tek bir SupportMapFragment içeren bir Activity oluşturulur. Şablon, ACCESS_FINE_PERMISSION öğesini uygulama manifest dosyasına da ekler ve OnMapReadyCallback parametresini etkinliğinize uygular ve gerekli onMapReady() yöntemini geçersiz kılar.

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

  • Normal: Tipik yol haritası. Yolları, insanlar tarafından inşa edilmiş bazı özellikleri ve nehirler gibi önemli doğal özellikleri gösterir. Yol ve özellik etiketleri de görülebilir.
  • Karma: Yol haritası eklenmiş uydu fotoğrafı. Yol ve özellik etiketleri de görülebilir.
  • Uydu: Fotoğraf verileri. Yol ve özellik etiketleri görünür değil.
  • Arazi: Topografik veriler. Haritada renkler, kontur çizgileri, etiketler ve perspektif gölgelendirme bulunur. Bazı yollar ve etiketler de görünür durumdadır.
  • Yok: Temel harita kutusu yok.

Google Haritalar hakkında:

  • İşaretçi, belirli bir coğrafi konum için göstergedir.
  • Dokunulduğunda, işaretçinin varsayılan davranışı, konum hakkında bilgi içeren bir bilgi penceresi görüntülemektir.
  • Varsayılan olarak, önemli noktalar (ÖY'ler) temel haritada ilgili simgelerle birlikte gösterilir. ÖY'ler arasında parklar, okullar, hükümet binaları ve daha fazlası yer alır.
  • Ayrıca, harita türü normal olduğunda, iş ÖY'leri (mağazalar, restoranlar, oteller ve daha fazlası) varsayılan olarak haritada gösterilir.
  • ÖY'lere yapılan tıklamaları OnPoiClickListener kullanarak yakalayabilirsiniz.
  • Stil Sihirbazı'nı kullanarak bir Google Haritası'nın neredeyse tüm öğelerinin görsel görünümünü değiştirebilirsiniz. Stil Oluşturma Sihirbazı, setMapStyle() yöntemini kullanarak Google Haritalar'a geçireceğ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 düzeltmek için zemin bindirme kullanın.
  • Resmi, resmin boyutunu metre cinsinden ve resmin konumunu belirtmek için bir GroundOverlayOptions nesnesi kullanın. Yer paylaşımını haritaya ayarlamak için bu nesneyi GoogleMap.addGroundOverlay() yöntemine geçirin.
  • Uygulamanızın ACCESS_FINE_LOCATION iznine sahip olması koşuluyla, map.isMyLocationEnabled = true özelliğini ayarlayarak konum izlemeyi etkinleştirebilirsiniz.
  • Bu codelab'de yer almamaktadır ancak belirli bir konumun gezinilebilir panorama fotoğrafı olan Google Street View'u kullanarak bir konum hakkında ek bilgiler sağlayabilirsiniz.

Android geliştirici dokümanları:

Referans belgeleri:

Bu kurstaki diğer codelab'lerin bağlantıları için Kotlin codelab'lerde Gelişmiş Android açılış sayfası konusuna bakın.