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
- Yeni bir Android Studio projesi oluşturun.
- Google Haritalar Etkinliği şablonunu seçin.
- Projeyi adlandırın
Wander
. - Minimum API düzeyini API 19 olarak ayarlayın. Dilin Kotlin olduğundan emin olun.
- Son'u tıklayın.
- 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
- google_maps_api.xml dosyasının hata ayıklama sürümünü açın.
- Dosyada uzun URL'li bir yorum bulun. URL'nin parametreleri, uygulamanızla ilgili belirli bilgileri içerir.
- URL'yi kopyalayıp bir tarayıcıya yapıştırın.
- 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.
- API anahtarı oluştur'u tıklayın.
- Sonraki sayfada API Anahtarları bölümüne gidin ve yeni oluşturduğunuz anahtarı tıklayın.
- 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.
- Oluşturulan API anahtarını kopyalayın. "
AIza"
" ile başlar. google_maps_api.xml
dosyasında, anahtarıYOUR_KEY_HERE
yazangoogle_maps_key
dizesine yapıştırın.- 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.
MapsActivity
bölümünde,mMap
öğesini sağ tıklayın ve Yeniden düzenle > Yeniden adlandır...'ı tıklayın.
- 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:
- 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.
- Haritanın başlangıç konumunu kendi evinizin bulunduğu konuma taşıyın.
- 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.
- Yeni bir menü XML dosyası oluşturmak için res dizininizi sağ tıklayın ve Yeni > Android Kaynak Dosyası'nı seçin.
- İletişim kutusunda dosyaya ad verin
map_options
. - Kaynak türü olarak Menü'yü seçin.
- Tamam'ı tıklayın.
- 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>
strings.xml
bölümünde, hataları düzeltmek içintitle
ö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>
MapsActivity
içindeonCreateOptionsMenu()
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
}
MapsActivity.kt
içindeonOptionsItemSelected()
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)
}
- Uygulamayı çalıştırın.
- 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
MapsActivity.kt
dosyasındaonMapReady()
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
}
- Bu talimatları uygulayarak evinizin enlemini ve boylamını bulun.
- 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
homeLatLng
adlı yeni birLatLng
nesnesi oluşturun.homeLatLng
nesnesinde, yeni oluşturduğunuz değerleri iletin.
val homeLatLng = LatLng(latitude, longitude)
- 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ünya5
: Karalar/kıta10
: Şehir15
: Sokaklar20
: Binalar
map
nesnesindemoveCamera()
işlevini çağırarak veCameraUpdateFactory.newLatLngZoom()
kullanarakCameraUpdate
nesnesi ileterek kamerayıhomeLatLng
konumuna getirin.homeLatLng
nesnesini vezoomLevel
değerini iletin.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
- 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))
}
- 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.
MapsActivity
içindesetMapLongClick()
adlı bir yöntem saplaması oluşturun. Bu yöntem, bağımsız değişken olarakGoogleMap
alır.- Harita nesnesine
setOnMapLongClickListener
dinleyici ekleyin.
private fun setMapLongClick(map:GoogleMap) {
map.setOnMapLongClickListener { }
}
setOnMapLongClickListener()
içindeaddMarker()
yöntemini çağırın. Konumu, iletilenLatLng
olarak ayarlanmış yeni birMarkerOptions
nesnesi iletin.
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
onMapReady()
yönteminin sonundamap
ilesetMapLongClick()
'ı arayın.
override fun onMapReady(googleMap: GoogleMap) {
...
setMapLongClick(map)
}
- Uygulamanızı çalıştırın.
- Bir konuma işaretçi yerleştirmek için haritaya dokunup basılı tutun.
- İş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.
setMapLongClick()setOnMapLongClickListener()
içindesnippet
içinval
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)
)
}
}
addMarker()
içinde,R.string.
dropped_pin
dize kaynağını kullanarak işaretçinintitle
değerini "Bırakılan İşaret" olarak ayarlayın.- İşaretçinin
snippet
değerinisnippet
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)
)
}
}
- Uygulamanızı çalıştırın.
- Konum işaretçisi bırakmak için haritaya dokunup basılı tutun.
- 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.
MapsActivity
içindesetPoiClick()
adlı bir yöntem saplaması oluşturun. Bu yöntem, bağımsız değişken olarakGoogleMap
alır.setPoiClick()
yönteminde, iletilenGoogleMap
üzerinde birOnPoiClickListener
ayarlayın.
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
}
}
setOnPoiClickListener()
içinde işaretçi için birval poiMarker
oluşturun .map.addMarker()
ileMarkerOptions
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)
)
}
}
setOnPoiClickListener()
işlevinde, bilgi penceresini hemen göstermek içinpoiMarker
üzerindeshowInfoWindow()
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()
}
}
onMapReady()
sonundasetPoiClick()
numaralı telefonu arayıpmap
kodunu girin.
override fun onMapReady(googleMap: GoogleMap) {
...
setPoiClick(map)
}
- Uygulamanızı çalıştırın ve park veya kafe gibi bir ÖY bulun.
- Ü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
- Tarayıcınızda https://mapstyle.withgoogle.com/ adresine gidin.
- Stil Oluştur'u seçin.
- Retro'yu seçin.
- Diğer Seçenekler öğesini tıklayın.
- Özellik türü listesinde Yol > Doldur'u seçin.
- Yolların rengini istediğiniz renkle (ör. pembe) değiştirin.
- Son'u tıklayın.
- 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
- Android Studio'da
res
dizininde bir kaynak dizini oluşturun veraw
olarak adlandırın.raw
dizin kaynaklarını JSON kodu gibi kullanırsınız. res/raw
içindemap_style.json
adlı bir dosya oluştur.- Saklanan JSON kodunuzu yeni kaynak dosyasına yapıştırın.
MapsActivity
içinde,onCreate()
yönteminin üzerinde birTAG
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
- Ayrıca
MapsActivity
içinde,GoogleMap
alan birsetMapStyle()
işlevi oluşturun. setMapStyle()
bölümünetry{}
bloğu ekleyin.try{}
bloğunda, stilin başarılı olması içinval success
oluşturun. (Aşağıdaki catch bloğunu eklersiniz.)try{}
bloğunda, JSON stilini haritaya ayarlayın veGoogleMap
nesnesindesetMapStyle()
işlevini çağırın. JSON dosyasını yükleyen birMapStyleOptions
nesnesi iletin.- 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
)
)
}
}
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.")
}
}
}
- Eksik stil dosyası durumunu ele almak için
catch{}
bloğu ekleyin.catch
bloğunda, dosya yüklenemiyorsaResources.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)
}
}
- Son olarak,
setMapStyle()
yönteminionMapReady()
yöntemindeGoogleMap
nesnenizi ileterek çağırın.
override fun onMapReady(googleMap: GoogleMap) {
...
setMapStyle(map)
}
- Uygulamanızı çalıştırın.
- 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.
onMapLongClick()
yönteminde, varsayılan işaretçiyi kullanmak için aşağıdaki kod satırını oluşturucununMarkerOptions()
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))
)
}
- 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.
- Bu Android görüntüsünü indirip
res/drawable
klasörüne kaydedin. (Dosya adınınandroid.png
olduğundan emin olun.)
onMapReady()
içinde, kamerayı evinizin konumuna taşıma çağrısından sonra birGroundOverlayOptions
nesnesi oluşturun.- Nesneyi
androidOverlay
adlı bir değişkene atayın.
val androidOverlay = GroundOverlayOptions()
- İndirilen resim kaynağını kullanarak
BitmapDescriptorFactory.fromResource()
yöntemini kullanarakBitmapDescriptor
nesnesi oluşturun. - Elde edilen
BitmapDescriptor
nesnesiniGroundOverlayOptions
nesnesininimage()
yöntemine iletin.
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
- İstenen yer paylaşımının metre cinsinden genişliği için
float overlaySize
oluşturun. Bu örnek için100f
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)
GoogleMap
nesnesindeaddGroundOverlay()
işlevini çağırın veGroundOverlayOptions
nesnenizi iletin.
map.addGroundOverlay(androidOverlay)
- Uygulamayı çalıştırın.
- 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.
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" />
MapsActivity
içindeREQUEST_LOCATION_PERMISSION
sınıf değişkeni oluşturun.
private val REQUEST_LOCATION_PERMISSION = 1
- İzinlerin verilip verilmediğini kontrol etmek için
MapsActivity
içindeisPermissionGranted()
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
}
- Uygulamanızda konum takibini etkinleştirmek için
MapsActivity
içindeenableMyLocation()
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. İçerideACCESS_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
)
}
}
- Konum katmanını etkinleştirmek için
onMapReady()
geri arama özelliğini kullanarakenableMyLocation()
numaralı telefonu arayın.
override fun onMapReady(googleMap: GoogleMap) {
...
enableMyLocation()
}
onRequestPermissionsResult()
yöntemini geçersiz kılın.requestCode
,REQUEST_LOCATION_PERMISSION
değerine eşitse izin verilir vegrantResults
dizisi boş değilse ve ilk yuvasındaPackageManager.PERMISSION_GRANTED
varsaenableMyLocation()
ç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()
}
}
}
- 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.
- 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 birActivity
oluşturur. Şablon, uygulama manifestineACCESS_FINE_PERMISSION
öğesini de ekler, etkinliğinizdeOnMapReadyCallback
öğesini uygular ve gereklionMapReady()
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 nesneyiGoogleMap.addGroundOverlay()
yöntemine iletin. - Uygulamanızın
ACCESS_FINE_LOCATION
izni varsamap.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:
- Başlayın
- İşaretçi içeren harita ekleme
- Harita Nesneleri
- Stil verilmiş harita ekleme
- Street View
- Zemin Yer Paylaşımları
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.