Android’de Google Maps ile anlık konum bul, Kotlin

Süleyman Başaranoğlu
4 min readDec 1, 2021

Bu yazıda Google Maps üzerinde yardımcı API kullanarak nerede olduğunuzu gösteren küçük bir uygulama yapacağız.

Developers Google üzerinden bu linke tıklayıp bir API key oluşturalım. (Daha detaylı key alım anlatımı için tıklayın). Sonrasında aşağıdaki gibi Google Maps projesi oluşturalım.

Yukarıda oluşturduğunuz key’i aşağıda google_maps_api.xml içerisinde YOUR_KEY ‘ yerine yazalım.

Burda gradle dosyamıza eklemelerimizi yapalım.

implementation 'com.google.android.gms:play-services-location:18.0.0'

MapsActivity’i açınca aşağıdaki gibi bir onMapReady override fonksiyonunu göreceğiz.

class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

private lateinit var mMap: GoogleMap
private lateinit var binding: ActivityMapsBinding
.
.
.

override fun onMapReady(googleMap: GoogleMap) {
1 mMap = googleMap
2 val sydney = LatLng(-34.0, 151.0) <- Statik oluşturulmuş konum
3 mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
4 mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
}

Yukarıda

1. satırda mMap ile GoogleMap class’ı çağırıyoruz. Bu class içerisinde zoom, map, location, camera position/move/animate, marker gibi işlemler yapılmaktadır.

2.satırda sydney adında bir değişken tanımlanmış ve LatLng sınıfı yardımı ile sydney değişkenine atanmış. Buradaki -34.0 ve 151.0 sydney’in X = Longitude, Y = Latitude olarak düşünebilirsiniz.

3. satırda mMap yani GoogleMap sınıfının bize sunduğu yukarıda bahsettiğim özelliklerden biri olan MarkerOptions kullanılarak pozisyonu ve title atanmış.

4. satırda ise uygulama ilk başladığında yine GoogleMap sınıfının imkanları ile kamera hareketi yapılarak tanımlanan X ve Y değişkenlerini bulacak şekilde hareket sağlanır.

Öncelikle yukarıdaki sydney yerine isterseniz buradan kendi kordinatlarınızı bularak statik bir şekilde basarak işe başlayalım.

val myHome  = LatLng(41.079380, 29.088511)
mMap.addMarker(MarkerOptions().position(myHome).title("Bizim ev"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(myHome))

Yukarıdaki kodu çalıstırarak basitçe nerede olduğunuzu bulabilirsiniz ama biz bir adım daha öteye ilerletelim ve kullanıcıdan konumunu kullanmak istediğimizi ve bu konuma ait olan kordinatları kullanıcı statik girmeden almayı bunu marker ile işaretlemeyi ve üstüne gelince kordinatları göstermeyi yazalım.

Bir fonksiyon tanımlayalım ve mapSetUp olsun adı burada kullanıcı izinlerini alacağız ve anlık konum işlemlerini yazmaya başlayacağız. İlk işimiz lateinit olarak anlık konum değişkeni ve Android üzerinde GPS ile kullanıcının konumuna erişebilmek için Fused Location’ ı kullanacağız.

private lateinit var currentLocation: Location
private lateinit var fusedLocationClient:FusedLocationProviderClient

Fonksiyonu oluşturalım

private fun mapSetUp() {
mMap.isMyLocationEnabled = true

Yukarıda ki kodu yazınca bize android studio hata vererek kullanıcıdan izin almamız gerektiğini aşağıda söylüyor.

Burada sol taraftan direk permissions ekleyebiliriz veya alttaki gibi kendimiz düzenleyerek yazabiliriz.

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_CODE_MAP
)
return
}

Yukarıda klasik kodlar dışında REQUEST_CODE yer almakta bunu biz statik bir şekilde companion object içerisinde const değişken olarak tanımlayacağız aşağıdaki gibi . Burada 1 olması önemli değil tek önemli olan bu değerin Int olması aksi taktirde aşağıdaki gibi bir hata ile karışalışırsınız.

companion object {
private const val REQUEST_CODE = 1
}

Yukarıda bahsettiğim Android’de user GPS işlemleri için Fused Location’u aşağıda kullanalım.

fusedLocationClient.lastLocation.addOnSuccessListener(this) { location ->

location?.let{
lastLocation = location
val currentLatLong = LatLng(location.latitude, location.longitude)
markerOnMap(currentLatLong)
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLong, 12f))
}
}

Yıukarıda sorulması gereken markerOnMap nereden çıktı. Aslında en başta yapılan kotlinin hazır verdiği kod satırlarındaki

3 mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))

farkı yok. Sadece fonksiyona çıkıldı aşağıdaki gibi böylece x ve y kordinatlarını marker üzerinde göreceğiz.

private fun markerOnMap(currentLatLong: LatLng) {
val markerOptions = MarkerOptions().position(currentLatLong)
markerOptions.title("$currentLatLong")
mMap.addMarker(markerOptions)
}

Son olarak harita üzerinde işaretleme için sınıfımıza aşağıdaki kalın yazılan kodu ekleyelim ve android studionun yine bize aşağıdaki gibi kızması ile onMarkerClick fonksiyonunu override edelim.

class MapsActivity : AppCompatActivity(), OnMapReadyCallback, GoogleMap.OnMarkerClickListener {
override fun onMarkerClick(p0: Marker) = false

Bundan sonra 2 adım kalıyor bunlardan ilki bize başta verilen onMapReady fonksiyonunu düzenlemek.

override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap <- Eski
mMap.uiSettings.isZoomControlsEnabled = true <-Map üzerinde yakınlaştırma gibi işlemler
mMap.setOnMarkerClickListener(this) <- Işaretleme
setupMap() <- Yazdığımız fonksiyon
}

onCreate içinde son tanımlamayı yaparak uygulamayı ayağı kaldıralım.

fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

--

--