Android

Lokasyon Tabanlı Android Uygulaması Geliştirmek

Herkese merhabalar,

     Bugün, android için lokasyon tabanlı bir  uygulamanın geliştirilme aşamalarını anlatacağım. Öncelikle uygulamamız için “GoogleMapsApi Key” kaydı yapacağız ve daha sonra gerekli emülatör ayarlarını yaptıktan sonra  küçük bir uygulama geliştireceğiz. Herzamanki gibi faydalı olması dileğiyle 😉

 API Key Kaydı Yapmak

     İlk olarak bilgisayarımızdan komut penceresini açalım. Başlat’a cmd yazarak veya windowslogotuşu+r kombinasyonunda açılan run penceresinde cmd yazarak komut penceresine ulaşabiliriz. Komut penceresine ulaştıktan sonra hemen sistemimizde kurulu olan jdk’nın bin klasörü için bir path yazalım.(Erişim kolaylığı için!) API key için bizlerden md5 fingerprint gerekeceğinden aşağıdaki komutu yazarak uygulamamızın md5 fingerprint değerini elde edebiliriz. (NOT: 1)jdk6,7… veya jre üzerinden md5 fingerprint elde edilebilir. 2)Keystore varsayılan olarak “C:userskullanıcıadınız.android” dizini içerisinde bulunmaktadır.) 

keytool.exe -v -list -alias androiddebugkey -keystore <keystoreyolunuz> -storepass android -keypass android

Yukarıdaki komutu yazdıktan sonra aşağıdaki gibi bir ekran karşımıza gelecektir.

MD5 fingerprint değerimiz elde ettikten sonra,  http://code.google.com/intl/tr-TR/android/add-ons/google-apis/maps-api-signup.html adresine giriyoruz. Sayfanın altında bulunan ve aşağıdaki gibi görünen bölüme md5 fingerprint değerimizi giriyor ve dünyanın en büyük yalanı olan “I have read and agree…”  seçeneğini seçip generate diyoruz. Açılan sayfada Key ve Key’in nasıl kullanılacağıyla ilgili bilgiler yer almaktadır. Bunları yazımın sonunda paylaşacağım kaynak kod çıktılarında bulabilirsiniz.

Uygulama İçin Emülatör Ayarı

Uygulamamız için yeni bir emülatör oluşturmamız gerekecektir. Hedef olarak Google APIs seçip  emülatörümüzü aşağıdaki gibi oluşturalım.

Harita Uygulaması  

Bir harita uygulaması yapıyorsanız hiçbir değişiklik yapmadan uygulamayı ilk açtığınızda boş bir harita sayfası göreceksiniz. Lakin karşınıza  bomboş beyaz bir ekran geliyorsa bunun iki anlamı vardır: birincisi Api Key’i hatalı girmişsinizdir, ikincisi ise o anda internet bağlantınız yoktur.

Kısa bir bilgilendirmeden sonra geçelim uygulamamıza. Uygulamamız önceden belirlediğimiz lokasyonları bir işaretçiyle göstermeye yarıyor.  Aşağıda da görüldüğü üzere belirlediğimiz lokasyonlarda mavi bir şekil (overlay) görüyoruz. Bunlar google maps’te gördüğümüz bizleri bilgilendiren  baloncuklarla aynı şeyler. Burada sadece kendimize özel baloncuklar oluşturduğumuzu düşünelim.

Uygulamada Ankara, İstanbul  ve İzmir’i baloncukla gösterdim. Bu baloncuklar isteğe bağlı olarak eczane, okul, cafe, restoran veya  gittiğiiniz halı sahalar bile olabilir. Bunların ne olacağına karar vermek tamamen bizim elimizde.

Oluşturmuş olduğumuz mavi şekillere tıkladığımzda ise bir bilgilendirme penceresi karşımıza çıkıyor. Aşağıdaki şekilde de görüldüğü üzere tıkladığımız baloncuğun neresi olduğunu ve enlem ile boylamını belirttim. Yine burada da vereceğimiz bilgiler isteğe bağlı olarak çok çeşitli haller alabilirler.


    Verdiğim küçük uygulamada da görüldüğü gibi harita uygulamaları aslında çok geniş kapsamlı mobil uygulama dünyasının çok geniş kapsamlı bir parçası. İnovatif ve etkili fikirlerimizle insanların beğenisini toplayabilecek ve insanlara yarar sağlayabilecek onlarca uygulama geliştirmemiz mümkün.

Aşağıda  uygulamanın kaynak kod çıktılarını bulabilirsiniz.


isaret.png (overlay)


HaritaAct.java
package Dersler.Maps;

import java.util.List;
import java.util.Vector;
import android.os.Bundle;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.graphics.drawable.Drawable;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class HaritaAct extends MapActivity {

private MapView mapView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//İçeriği mapview olarak ayarla ve zoom kontrollerini ekle
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);

overlayGoster();
}

private void overlayGoster() {

List; mapOverlays = mapView.getOverlays();
//mapOverlays'e overlayOlustur'dan gelen itemizenoverlay'i ekliyoruz
mapOverlays.add(overlayOlustur());
MapController mc = mapView.getController();
//Overlay'e gidiyoruz ve 8'lik zoom yapıyoruz.(Uyg. Ankara'ya odaklanacaktır.)
mc.animateTo(overlayOlustur().getCenter());
mc.setZoom(8);
mapView.invalidate();

}

/*
* Oluşturmuş olduğumuz koordinat bilgilerinden elde edilen GeoPoint
* overlayitem olarak düzenleniyor. Daha sonra overlayitem  MyOverlay tipindeki
* itemizedoverlay'e ekleniyor. Olusturulan itemizedoverlay geri döndürülüyor.
*/
private MyOverlay overlayOlustur() {
//Kaynaklarımız içerisindeki  isaret görseli drawable nesnesine atanıyor.
Drawable drawable = this.getResources().getDrawable(R.drawable.isaret);

MyOverlay itemizedoverlay = new MyOverlay(drawable,
mapView.getContext());

for (KoordinatBilgisi koordinatBilgisi : koordinatListesiOlustur()) {

OverlayItem overlayitem = new OverlayItem(koordinatBilgisi.getGeoPoint()
, koordinatBilgisi.getLokasyonAdi(), "E: "
+ koordinatBilgisi.getEnlem()+ " , B: " + koordinatBilgisi.getBoylam());

//Herbir overlay'i itemizedoverlay'e ekle.
itemizedoverlay.addOverlay(overlayitem);
}

return itemizedoverlay;

}
/*
* Harita üzerinde gösterilmek üzere örnek koordinatlarlar oluşturulup Vektörde tutuluyor
* ve oluşturulan Vectör döndürülüyor.
* (!!!) Burada küçük miktarda örnek veri kullandığımız için veriyi kodun içerisine
* gömmek kabul edilebilir; ama çok fazla miktarda verinin olduğu durumlarda database
* veya başka bir veri kaynağından verileri okumak daha mantıklı olacaktır.
*/
private Vector<KoordinatBilgisi> koordinatListesiOlustur() {

Vector; kListesi = new Vector;();

kListesi.add(new KoordinatBilgisi("Ankara", 39.917636, 32.858047));
kListesi.add(new KoordinatBilgisi("İstanbul", "41.005270", "28.976960"));//farklı tipte veri girişi
kListesi.add(new KoordinatBilgisi("İzmir", 38.418830, 27.132626));

return kListesi;
}

@Override
protected boolean isRouteDisplayed() {
return false;
}
}

MyOverlay.java
package Dersler.Maps;

import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class MyOverlay extends ItemizedOverlay<OverlayItem> {

private ArrayList mOverlays = new ArrayList();
Context mContext;

public MyOverlay(Drawable varsayilanIsaretci) {
super(varsayilanIsaretci);

}

public MyOverlay(Drawable varsayilanIsaretci, Context context) {
super(boundCenter(varsayilanIsaretci));
mContext = context;
}

public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}

@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}

@Override
public int size() {
return mOverlays.size();
}

/*
* Overlay üzerine dokunulduğunda dialog box içerisinde
* overlay oluşturulurken girilen bilgileri göster.
*/
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);

AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());

dialog.show();

return true;
}

}

KoordinatBilgisi.java

package Dersler.Maps;

import com.google.android.maps.GeoPoint;
/*
* İlgili koordinatları ad, enlem, boylam olarak tutan sınıfımız.
*/

public class KoordinatBilgisi {

private String lokasyonAdi;
private double enlem;
private double boylam;

/*
*Farklı yapılardaki yapıcı methodlarımız verikaynaklarımız heterojen olduğunda
*bizlere büyük esneklik sağlayacaklardır. Yapmış olduğumuz bu küçük uygulamada çok
*gerekli olmamakla birlikte çoğu zaman enlem ve boylam değerlerinin
*değişik tiplerde tutulduğu gerçeği göz ardı edilemez.
*/
public KoordinatBilgisi(String lokasyonAdi, double enlem, double boylam) {

this.lokasyonAdi = lokasyonAdi;
this.enlem = enlem;
this.boylam = boylam;
}
/*
* Yapıcı method 2:
*/
public KoordinatBilgisi(String lokasyonAdi, String enlem, String boylam) {

this.lokasyonAdi = lokasyonAdi;
this.enlem = Double.parseDouble(enlem);
this.boylam = Double.parseDouble(boylam);
}

/*
* Yapıcı method 3:
*/
public KoordinatBilgisi() {
}

/*
* Varolan enlem ve boylamlardan GeoPoint üretiyoruz. Eğer böyle bir method oluşturmasaydık,
* GeoPoint kullanmamız gereken her noktada önce parse işlemi yapmamız gerekecekti.
*/
public GeoPoint getGeoPoint()
{
return new GeoPoint((int) (enlem * 1E6), (int) (boylam * 1E6));
}

/*
* Getters, Setters
*/

public String getLokasyonAdi() {
return lokasyonAdi;
}

public void setLokasyonAdi(String lokasyonAdi) {
this.lokasyonAdi = lokasyonAdi;
}

public double getEnlem() {
return enlem;
}

public void setEnlem(double enlem) {
this.enlem = enlem;
}

public double getBoylam() {
return boylam;
}

public void setBoylam(double boylam) {
this.boylam = boylam;
 }

}


AndroidManifest.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
    package=”Dersler.Maps” android:versionCode=”10″ android:versionName=”1.0.0″>
    <application android:icon=”@drawable/icon” android:label=”@string/app_name”>

        <uses-library android:name=”com.google.android.maps” />

        <activity android:name=”.HaritaAct” android:label=”Harita Uygulaması”>
            <intent-filter>
                <action android:name=”android.intent.action.MAIN” />
                <category android:name=”android.intent.category.LAUNCHER” />
            </intent-filter>
        </activity>
    </application>

<uses-permission android:name=”android.permission.INTERNET” />
</manifest>


main.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
    android:orientation=”vertical” android:layout_width=”fill_parent”
    android:layout_height=”fill_parent”>

    <com.google.android.maps.MapView
        android:id=”@+id/mapview”
         android:layout_width=”fill_parent”
        android:layout_height=”fill_parent”
        android:clickable=”true”
        android:apiKey=”API KEY’I BURAYA YAZIYORUZ” />
</LinearLayout>


Anlatmış olduğum uygulamanın gerek hobi olarak android uygulaması geliştirenlere gerekse tez vb. konularda benzer uygulamalarla ilgili çalışma yapan arkadaşlara faydalı olacağını düşünüyorum.

Daha sonraki yazılarımda görüşmek üzere. Okuduğunuz için çok teşekkürler 😉 .

 

 

4 Comments

  1. Merhaba,

    Öncelikle paylaşım için teşekkürler. Ben girdiğim iki şehir arasındaki en kısa yolu bana gösterecek bir uygulama yapmak istiyorum. Bunu nasıl gerçekleştirebilirim?

    1. Merhabalar,

      Girdiğin iki şehir arasındaki kuş uçuşu mesafeyi (noktadan noktaya) hesaplamak için iki geopoint için “distanceTo” diye bir method var. Onu kullanarak rahatlıkla metre olarak elde edebilirsin.

      Location sehirA = new Location(“sehirA”);
      Location sehirB = new Location(“sehirB”);
      sehirA.setLatitude(38.458092 );
      sehirA.setLongitude(27.213349 );
      sehirB.setLatitude(38.453092 );
      sehirB.setLongitude(27.263349 );

      distance = sehirA.distanceTo(sehirB);
      metre olarak cevap döner 😉

      Eğer sen iki nokta arasında yol çizdirmek istiyorsan google direktion API üzerinden web’ten nokta çiftlerini alıp hepsini overlay olarak ekranda bastırmalısın. Nette ingilizce örnekleri var, yoğunum bu aralar ama ihtiyaç durumunda yardımcı olmaya çalışırım elimden geldiği kadarıyla 😉

      İyi çalışmalar.

  2. Dostum o kadar yerden araştırdım,denedim hep hatayla karşılaştım, tam olarak çalışmadı burdan denedim sonunda oldu ellerine sağlık :))

    1. Sen git kipayı, tansaşı, migrosu gez:) En son mahalle bakkalına gel:) Yazdım bunu Cns 🙂

Comments are closed.