Android Studio Haritalar Kullanımı

Haritalar kullanımını basit bir uygulama yaparak anlatmaya çalışacağım. 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 |
<?xml version="1.0" encoding="utf-8"?> <android.widget.RelativeLayout 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.haritalarkullanimi.MainActivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:layout_marginBottom="60dp" /> <Button android:id="@+id/addButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:onClick="add" android:text="EKLE" /> </android.widget.RelativeLayout> |
MainActivity.java sınıfımızı aşağıdaki gibi düzenleyelim.
MainActivity.java
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 |
package com.example.esatgozcu.haritalarkullanimi; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import com.google.android.gms.maps.model.LatLng; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { Button button; ListView listView; // Diğer sayfadan ulaşılabilir olması için static yapıyoruz. static ArrayList<String> names = new ArrayList<String>(); static ArrayList<LatLng> locations = new ArrayList<LatLng>(); static ArrayAdapter arrayAdapter; SQLiteDatabase database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button)findViewById(R.id.addButton); listView=(ListView)findViewById(R.id.listView); getData(); arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, names); listView.setAdapter(arrayAdapter); // Listview'deki itemlere tıklandığı zaman.. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Haritalar sayfasına geçiş yapıyoruz. Intent intent = new Intent(getApplicationContext(), MapsActivity.class); // Mevcut konumun görüntüleneceğini bildiriyoruz. intent.putExtra("info", "old"); intent.putExtra("position", position); startActivity(intent); } }); } // Veritabanından verileri arraylistlere aktarıyoruz. private void getData() { try { // Veritabanını açma veya yok ise oluşturma database = this.openOrCreateDatabase("Places", MODE_PRIVATE, null); // Tablo oluşturma Cursor cursor = database.rawQuery("SELECT * FROM places", null); // Verileri çekebilmek için index oluşturuyoruz int nameIx = cursor.getColumnIndex("name"); int latitudeIx = cursor.getColumnIndex("latitude"); int longitudeIx = cursor.getColumnIndex("longitude"); // Veritabanın ilk satırına gidiyoruz cursor.moveToFirst(); // İlk satırdan itibaren verileri teker teker çekiyoruz ve dizilere aktarıyoruz. while (cursor != null) { String nameFromDatabase = cursor.getString(nameIx); String latitudeFromDatabase = cursor.getString(latitudeIx); String longitudeFromDatabase = cursor.getString(longitudeIx); names.add(nameFromDatabase); Double l1 = Double.parseDouble(latitudeFromDatabase); Double l2 = Double.parseDouble(longitudeFromDatabase); LatLng locationFromDatabase = new LatLng(l1,l2); locations.add(locationFromDatabase); // Bir sonraki satıra geçiyoruz cursor.moveToNext(); } } catch (Exception e) { e.printStackTrace(); } } // Ekle tuşuna basıldığı zaman.. public void add (View view) { // Harita sayfasına geçiş yapıyoruz. Intent intent = new Intent(getApplicationContext(), MapsActivity.class); // Yeni konum ekleneceğini 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.java sınıfımızı düzenlemek kaldı aşağıdaki gibi sınıfımızı düzenleyelim.
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 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
package com.example.esatgozcu.haritalarkullanimi; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.os.Bundle; 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.io.IOException; import java.util.List; import java.util.Locale; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener { private GoogleMap mMap; LocationManager locationManager; LocationListener locationListener; SQLiteDatabase database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setOnMapLongClickListener(this); // Konum tespit özelliklerini kullanabilmek için LocationManager oluşturuyoruz. locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // Kullanıcının konumu değiştiği zaman konumu güncelliyoruz. LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude()); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation,15)); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; // İzin işlemlerini ayarlıyoruz. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION},1); } else // İzin verilmiş ise.. { // Konumu güncelliyoruz. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener); Intent intent = getIntent(); String info = intent.getStringExtra("info"); if (info.equalsIgnoreCase("new")) { // Eğer yeni konum eklenecekse.. mMap.clear(); // Kullanıcının son konumunu haritada yaklaştırıyoruz. Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); LatLng lastUserLocation = new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude()); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lastUserLocation,15)); } else { // Mevcut konum görüntüleneceği zaman.. mMap.clear(); int position = intent.getIntExtra("position", 0); // MainActivity sayfasında bulunan locations array'inden verimizi çekiyoruz. LatLng location = new LatLng(MainActivity.locations.get(position).latitude, MainActivity.locations.get(position).longitude); //Haritaya aktarıyoruz. mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,15)); // Haritada yerin belli olması için marker ekliyoruz başlığına kayıt ettiğimiz ismi yazıyoruz. mMap.addMarker(new MarkerOptions().position(location).title(MainActivity.names.get(position))); } } } // İzin isteme sonucunu kontol ediyoruz. @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (grantResults.length > 0) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // Eğer izin verilmiş ise.. // Konumu güncelliyoruz. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener); Intent intent = getIntent(); String info = intent.getStringExtra("info"); if (info.equalsIgnoreCase("new")) { // Eğer yeni konum eklenecekse.. mMap.clear(); // Kullanıcının son konumunu haritada yaklaştırıyoruz. Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); LatLng lastUserLocation = new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude()); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lastUserLocation,15)); } else { // Mevcut konum görüntüleneceği zaman.. mMap.clear(); int position = intent.getIntExtra("position", 0); // MainActivity sayfasında bulunan locations array'inden verimizi çekiyoruz. LatLng location = new LatLng(MainActivity.locations.get(position).latitude, MainActivity.locations.get(position).longitude); //Haritaya aktarıyoruz. mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,15)); // Haritada yerin belli olması için marker ekliyoruz başlığına kayıt ettiğimiz ismi yazıyoruz. mMap.addMarker(new MarkerOptions().position(location).title(MainActivity.names.get(position))); } } } } // Harita üzerine uzun basılı tutulduğunda.. @Override public void onMapLongClick(LatLng latLng) { // Koordinat bilgisine göre konum bulmak için Geocoder oluşturuyoruz. Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); String address = ""; try { List<Address> addressList = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1); if (addressList != null && addressList.size() > 0) { if (addressList.get(0).getThoroughfare() != null) { address += addressList.get(0).getThoroughfare(); if (addressList.get(0).getSubThoroughfare() != null) { address += addressList.get(0).getSubThoroughfare(); } } } else { address = "New Place"; } } catch (IOException e) { e.printStackTrace(); } // Dokunduğumuz yere Marker ekliyoruz başlığını Geocoder'dan gelen adresi ekliyoruz. mMap.addMarker(new MarkerOptions().position(latLng).title(address)); // MainActivity sınıfındaki arrayList'lere verileri ekliyoruz. MainActivity.names.add(address); MainActivity.locations.add(latLng); MainActivity.arrayAdapter.notifyDataSetChanged(); Toast.makeText(getApplicationContext(),"Yeni yer oluşturuldu",Toast.LENGTH_LONG).show(); try { // Veritabanına kayıt ediyoruz. Double l1 = latLng.latitude; Double l2 = latLng.longitude; String coord1 = l1.toString(); String coord2 = l2.toString(); database = this.openOrCreateDatabase("Places", MODE_PRIVATE, null); database.execSQL("CREATE TABLE IF NOT EXISTS places (name VARCHAR, latitude VARCHAR, longitude VARCHAR)"); String toCompile = "INSERT INTO places (name, latitude, longitude) VALUES (?, ?, ?)"; SQLiteStatement sqLiteStatement = database.compileStatement(toCompile); sqLiteStatement.bindString(1, address); sqLiteStatement.bindString(2, coord1); sqLiteStatement.bindString(3, coord2); sqLiteStatement.execute(); } catch (Exception e) { 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.