Harita ve konum teknolojileri ile hayatımızdaki birçok probleme çözüm sağlayarak işlerimizi kolaylaştırıyoruz. Bu yüzden yazılım projelerimizde harita kullanımı çok önemlidir.
Bu makale Android uygulamada Google map üzerinde kullanıcının geçerli konumunu göstermeyi ve marker’ın (pin) sürüklenip bırakıldığı noktanın konum bilgilerini göstermeyi örnekleyecektir.
Proje kodlarına github linkinden ulaşabilirsiniz.
Örnek projemizi için sırasıyla ayar adımlarını ve kodlarımızı uygulayalım.
1- Google Play Services Yükleme
Google haritayla ilgili bir geliştirme yapacağımızdan dolayı, Google Play Services yüklememiz gerekmektedir. Bunun için Tools->Sdk manager’ı açıp Sdk Tools bölümünden Google Play Services işaretleyip, yükleme işlemini gerçekleştirin.
2- Google Maps API Key Oluşturma
Google Cloud sitesinde API Key oluşturma adımları video anlatmış bulunmaktayım. Videoda Direction API yerine Maps SDK for Android kütüphanesini aktif etmenizi öneririm.
3-Gerekli Kütüphanelerin Eklenmesi
Android Studio Ide ile oluşturduğum projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek Google Play services kütüphanesini yüklüyoruz.
1 2 |
implementation 'com.google.android.gms:play-services-maps:18.0.0' implementation 'com.google.android.gms:play-services-location:18.0.0' |
4-AndroidManifest Dosyasına İlgili Ayarları Ekleme
Belirtilecek konumun yer bilgisini almak için internet iznine ihtiyaç bulunmaktadır. Aşağıdaki izin kodunu da AndroidManifest.xml dosyasında application tag’nin üst kısmına yerleştirin.
1 2 3 |
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> |
1 2 |
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyB20HoSsbKFvQiWoI9RL7GGXf1KRwdxyoc" /> |
5- Haritayı Tasarımda Tanımlama
Harita sınıfını kullanacak xml tasarım şablonumuza Fragment arayüz elementi eklemeliyiz. android:name özelliğinede com.google.android.gms.maps.SupportMapFragment eklemeliyiz.
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> |
6- Kotlin ile Haritada Anlık Konum ve Marker’ın Sürüklendiği Adresi Bulma
Hazırladığım kodları aşama aşama açıklamalarını yazmış bulunmaktayım. Fonksiyonların özelliklerini özetleyelim.
getLocation fonksiyonunda izinleri ve xml yapısındaki SupportMapFragment tanımladım.
onMapReady fonksiyonunda ilk öncelikle anlık adres bilgisini marker ile haritada tanımladım. Sonrasında setOnMarkerDragListener metodu ile marker’ın sürüklendiği anın dinlenmesi ve marker’ın haritada bırakıldığı noktadaki konum bilgisini alıp arayüz de yansıtılması sağladım. Bu açıkladığım fonksiyonların içinde moveMarker ve getTheAddress metodlarını kullandım. Detaylarını kod yorumlarında bulabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import android.Manifest import android.content.pm.PackageManager import android.location.* import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import com.google.android.gms.location.* import com.google.android.gms.maps.* import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener import com.google.android.gms.maps.model.* import java.io.IOException import java.util.* class MainActivity : AppCompatActivity(), OnMapReadyCallback { var currentMarker: Marker? = null private lateinit var mMap: GoogleMap var currentLocation: Location? = null var fusedLocationProviderClient: FusedLocationProviderClient? = null private val REQUEST_CODE = 101 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); getLocation() } private fun getLocation() { //Konum ile ilgili izinlermizi tanımlıyoruz if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_CODE) return } //Kullanıcının bulunduğu yerin konumunu alıyoruz val task = fusedLocationProviderClient!!.lastLocation task.addOnSuccessListener { location -> if (location != null) { currentLocation = location //Xml'de ekledğimiz SupportMapFragment sınıfını burada kullanarak haritayı arayüzde gösteriyoruz. val supportMapFragment = (supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?)!! supportMapFragment.getMapAsync(this@MainActivity) } } } override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap val latLng = LatLng(currentLocation!!.latitude, currentLocation!!.longitude) //Haritada Marker ilk oluşturulur ve oanki adres bilgisini haritada gösterir moveMarker(latLng) //Marker'ın sürüklendiği anı dinleyen fonksiyon googleMap.setOnMarkerDragListener(object : OnMarkerDragListener { override fun onMarkerDragStart(marker: Marker) {} //Marker haritada sürüklendikten sonra bırakıldığı anı yakalayan fonksiyon override fun onMarkerDragEnd(marker: Marker) { if (currentMarker != null) { currentMarker?.remove() } //Haritada bırakıldığı noktadakı enlem boylam bilgisini alıp, marker oluşturma fonksyonu gerçekleşir val newlatLng = LatLng(marker.position.latitude, marker.position.longitude) moveMarker(newlatLng) } override fun onMarkerDrag(marker: Marker) {} }) } //Marker(işaretçi) oluşturma ve özelliklerini tanımlama private fun moveMarker(latLng: LatLng) { //Marker başlık, konumundaki adresi belirtme ve drag(sürükleme) özelliğini aktif etme val markerOptions = MarkerOptions().position(latLng).title("Konumum") .snippet(getTheAddress(latLng!!.latitude, latLng!!.longitude)).draggable(true) mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)) //Marker hareket ettiğinde ilgili noktaya zoom yapmayı sağlar mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f)) currentMarker = mMap.addMarker(markerOptions) currentMarker?.showInfoWindow() } //Fonksiyona gelen enlem, boylam bilgisine göre açık adres değerini verir private fun getTheAddress(latitude: Double, longitude: Double): String? { var retVal = "" val geocoder = Geocoder(this, Locale.getDefault()) try { val addresses = geocoder.getFromLocation(latitude, longitude, 1) retVal = addresses[0].getAddressLine(0) } catch (e: IOException) { e.printStackTrace() } return retVal } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String?>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { REQUEST_CODE -> if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getLocation() } } } } |
Proje kodlarına github linkinden ulaşabilirsiniz.