Kotlin ile GoogleMaps Kullanımı

GoogleMaps uygulamalarımızda harita işlemlerini çok fonksiyonlu olarak kolay bir şeklide kullanabilmemize olanak sağlar. Bu makalede bizde GoogleMaps özelliklerini nasıl kullanabileceğimizi basit bir uygulama yaparak anlamaya çalışacağız. Uygulamamımız bir seyehat defteri şeklinde olacak kullanıcı kayıt etmek istediği yerleri haritaya basılı tutarak veritabanına kayıt edecek. Android Studio’yu çalıştırıp yeni proje oluşturalım ve minumum sdk 23 olarak seçelim.
Daha sonra manuel olarak gelen activity_main.xml dosyamızı aşağıdaki gibi düzenleyelim.
activity_main.xml
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 |
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.esatgozcu.kotlingooglemaps.MainActivity"> <ListView android:id="@+id/listView" android:layout_width="368dp" android:layout_height="421dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" tools:layout_editor_absoluteY="0dp" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:layout_marginTop="8dp" android:onClick="add" android:text="EKLE" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/listView" /> </android.support.constraint.ConstraintLayout> |
MainActivity.kt sınıfımızı aşağıdaki gibi düzenleyelim.
MainActivity.kt
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 104 105 106 107 |
package com.example.esatgozcu.kotlingooglemaps import android.content.Context import android.content.Intent import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Adapter import android.widget.ArrayAdapter import com.google.android.gms.maps.model.LatLng import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { // Verilerimizi aktaracağımı dizilerimizi oluşturuyoruz. val namesArray = ArrayList<String>() val locationArray = ArrayList<LatLng>() // Harita sayfasından geri gelindiği zaman.. override fun onResume() { // Harita sayfasında gelince tekrarda dizileri güncelliyoruz. getData() super.onResume() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // ListView'de itemlere tıklanıldığı zaman.. listView.setOnItemClickListener { parent, view, position, id -> // MapsActivity sayfasına geçiş yapıyoruz val intent = Intent(applicationContext,MapsActivity::class.java) // Eski bir yer gösterileceğini belirtiyoruz. intent.putExtra("info","old") // MapsActivity sayfasına koordinatları ve adresi aktarıyoruz. intent.putExtra("name",namesArray[position]) intent.putExtra("latitude",locationArray[position].latitude) intent.putExtra("longitude",locationArray[position].longitude) startActivity(intent) } getData() } // Veritabanından verileri çekip dizilere aktarıyoruz. fun getData() { try { // Veritabanı açma veya yok ise oluşturma val database = openOrCreateDatabase("Yerler",Context.MODE_PRIVATE,null) // Tablo oluşturma val cursor = database.rawQuery("SELECT * FROM yerler",null) if (cursor != null) { // Verileri çekebilmek için index oluşturuyoruz val nameIndex= cursor.getColumnIndex("name") val latitudeIndex =cursor.getColumnIndex("latitude") val longitudeIndex= cursor.getColumnIndex("longitude") // Her seferinde üstüne yazmaması için dizileri temizliyoruz. namesArray.clear() locationArray.clear() // Bir sonraki satıra geçiyoruz. cursor.moveToFirst() // İlk satırdan itibaren verileri çekiyoruz ve dizilere aktarıyoruz. while (cursor!=null) { val nameData = cursor.getString(nameIndex) val latitudeData = cursor.getString(latitudeIndex) val longitudeData = cursor.getString(longitudeIndex) namesArray.add(nameData) val latitudeCoordinate = latitudeData.toDouble() val longitudeCoordinate = longitudeData.toDouble() val location = LatLng(latitudeCoordinate,longitudeCoordinate) locationArray.add(location) // Bir sonraki satıra geçiyoruz. cursor.moveToNext() } } }catch (e:Exception) { e.printStackTrace() } // Dizimizi ArrayAdaptere aktarıp listView ile bağlıyoruz. val arrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,namesArray) listView.adapter = arrayAdapter } // Ekle tuşuna basıldığı zaman fun add(view: View) { // MapsActivity sayfasına geçiş yapıyoruz. val intent = Intent(applicationContext,MapsActivity::class.java) // Yeni konum ekleneceğiniz belirtiyoruz. intent.putExtra("info","new") startActivity(intent) } } |
Buraya kadar olan kısımda uygulamayı çalıştırdığımız zaman karşımıza listView ve bir adet buton çıkacaktır. Kullanıcı ekle butonuna bastığı zaman harita sınıfına gidecek ve kaydettiği yerler listView’de görüntülenecek ama daha haritalar sınıfını eklemedik.
java klasörünün üstünde sağ tıklayarak new >> activity >> Gallery.. diyerek karşımıza çıkan sayfada Google Maps Activity seçerek sınıfımızı oluşturalım.
Karşımıza google_maps_api.xml dosyası gelecek ve burada yapmamız gereken bir ayar var aşağıdaki gibi aldığımız api kodunu projemize dahil etmemiz gerekiyor.
Ayarlamalarımız yaptığımıza göre son olarak MapsActivity.kt sınıfımızı düzenlemek kaldı aşağıdaki gibi sınıfımızı düzenleyelim.
MapsActivity.kt
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
package com.example.esatgozcu.kotlingooglemaps import android.app.Activity import android.content.Context import android.content.pm.PackageManager import android.location.Geocoder import android.location.Location import android.location.LocationListener import android.location.LocationManager import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.v4.app.ActivityCompat import android.support.v4.content.ContentResolverCompat import android.support.v4.content.ContextCompat import android.widget.Toast import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.OnMapReadyCallback import com.google.android.gms.maps.SupportMapFragment import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.MarkerOptions import java.util.* import java.util.jar.Manifest class MapsActivity : AppCompatActivity(), OnMapReadyCallback { private lateinit var mMap: GoogleMap var locationManager:LocationManager?=null var locationListener:LocationListener?=null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_maps) val mapFragment = supportFragmentManager .findFragmentById(R.id.map) as SupportMapFragment mapFragment.getMapAsync(this) } override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap mMap.setOnMapLongClickListener(myListener) // Konum tespit özelliklerini kullanabilmek için LocationManager oluşturuyoruz. locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager // Konum değişikliği olduğu zaman.. locationListener = object : LocationListener{ override fun onLocationChanged(location: Location?) { // Koordinatların olduğu yeri haritada yakınlaştırıyoruz. val userLocation = LatLng(location!!.latitude,location.longitude) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation,15f)) } override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) { } override fun onProviderEnabled(provider: String?) { } override fun onProviderDisabled(provider: String?) { } } // İzin verilmemiş ise izin istiyoruz. if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),1) } // İzin verilmiş ise.. else { // Konumu güncelliyoruz locationManager!!.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0f,locationListener) val intent = intent val info = intent.getStringExtra("info") // Eğer yeni konum eklenecekse.. if(info.equals("new")) { // Harita ilk açıldığında kullanıcının en son bilinen yerine gidiyoruz. mMap.clear() val lastLocation = locationManager!!.getLastKnownLocation(LocationManager.GPS_PROVIDER) if (lastLocation!=null) { val lastUserLocation = LatLng(lastLocation.latitude,lastLocation.longitude) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lastUserLocation,16f)) } } // Kayıtlı bir yer gösterileceği zaman.. else{ mMap.clear() // MainActivity sayfasında gelen koordinatları haritada gösteriyoruz. val latitude = intent.getDoubleExtra("latitude",0.0) val longitude = intent.getDoubleExtra("longitude",0.0) val name = intent.getStringExtra("name") val location = LatLng(latitude,longitude) mMap.addMarker(MarkerOptions().position(location).title(name)) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,16.0f)) } } } // İzin isteme sonucunu değerlendiriyoruz. override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { // Eğer izin isteme sonucunda bir sonuç varsa.. if (grantResults.size>0) { if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // Konumu güncelliyoruz. locationManager!!.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0f,locationListener) } } super.onRequestPermissionsResult(requestCode, permissions, grantResults) } // Haritanın üzerine uzun basıldığı zaman.. val myListener = object : GoogleMap.OnMapLongClickListener{ override fun onMapLongClick(p0: LatLng?) { // Koordinat bilgisine göre adres bulmak için geocoder oluşturuyoruz. val geocoder = Geocoder(applicationContext, Locale.getDefault()) var address = "" // Adres bilgisini çekiyoruz. try{ val addressList = geocoder.getFromLocation(p0!!.latitude,p0.longitude,1) if (addressList!=null && addressList.size>0) { if (addressList[0].thoroughfare!=null) { address+=addressList[0].thoroughfare if (addressList[0].subThoroughfare!=null) { address+=addressList[0].subThoroughfare } } } else { // Koordinatlar üzerindeki konum bulunamıyorsa.. address="Yeni Yer" } } catch (e:Exception) { e.printStackTrace() } // Dokunduğumuz yere Marker ekliyoruz ve başlığında Geocoder'dan gelen adresi ekliyoruz. mMap.addMarker(MarkerOptions().position(p0!!).title(address)) Toast.makeText(applicationContext,"Yeni Yer Oluşturuldu",Toast.LENGTH_LONG).show() try{ // Üzerine uzun basılı tutulan yerin koordinatlarını ve adres bilgisini veritabanına kayıt ediyoruz. val latitude = p0.latitude.toString() val longitude=p0.longitude.toString() val database = openOrCreateDatabase("Yerler",Context.MODE_PRIVATE,null) database.execSQL("CREATE TABLE IF NOT EXISTS yerler (name VARCHAR, latitude VARCHAR, longitude VARCHAR)") val toCompile = "INSERT INTO yerler (name,latitude,longitude) VALUES (?,?,?)" val sqLiteStatement = database.compileStatement(toCompile) sqLiteStatement.bindString(1,address) sqLiteStatement.bindString(2,latitude) sqLiteStatement.bindString(3,longitude) sqLiteStatement.execute() }catch (e:Exception) { e.printStackTrace() } } } } |
Böylelikle haritaların nasıl kullanıldığını ve nasıl işlevsellik kazandırabileceğimizi görmüş olduk sizde artık uygulamalarınızda haritaları kullanabilirsiniz.
Projenin kaynak kodlarını buraya tıklayarak indirebilirsiniz.