How to Detect Android GPS and Find Location


Eğer lokasyon bazlı bir uygulama veya harhangi bir harita uygulaması geliştiriyorsanız uygulamanız biraz akıllı olmalı, yani otomatik olarak sizin konumunuzu (location) bulmalı. Bunun için GPS modülleri ile entegre işlemler yapmalıyız. Aşağıda GPS Location API’ nin nasıl kullanıldığını göreceğiz.

1. AndroidManifest.mxl

Tabi ki başlamadan önce gelin AndroidManifest.xml dosyamızda biraz değişiklik yapalım. İzin talebimiz 2 durum hakkında olacak. INTERNET ve LOCATION. Bunlar için düzenlenmiş xml aşağıdaki gibidir:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gpstracking"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".AndroidGPSTrackingActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2. Konum bilgisi için gerekli olan, GPS bilgisini kontrol eden class’ ı yazalım.

Öncelikle yeni bir class oluşturalım ve adı da GPSTracket.java olsun. Daha sonra aşağıdaki değişikliği yapalım. Sizlerin de bildiği gibi normalde Activity‘ den extends ediliyordu class, fakat burada Service kullanacağız ve konum bilgisi sürekli değiştiği için de güncelliği kaybetmemek için LocationListener‘ den implement edeceğiz.

public class GPSTracker extends Service implements LocationListener{

2.1. Şimdi gerekli global değişkenlerimizi ve yapılandırıcımızı oluşturalım.

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // GPS durumunu kontrol eden durum, başlangıç olarak false.
    boolean isGPSEnabled = false;

    // Network durumunu kontrol eden durum, başlangıç olarak false.
    boolean isNetworkEnabled = false;

    boolean canGetLocation = false;

    Location location; // location, konum.
    double latitude; // latitude, enlem,
    double longitude; // longitude, boylam.

    // Değişikliğin kaç metrede bir yapılacağını gösteren değer.
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 metre

    // Milisaniye bazında güncellemeler arasındaki en küçük zaman dilimi
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 dakika

    // Location Manager tanımlıyoruz.
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

2.2. getLocation() metodunu yazalım.

Gördüğünüz gibi yapılandırıcının içerisinde getLocation() metodunu çağırdık. Şimdi class’ a devam edelim ve getLocation() metodunu dolduralım.

public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // GPS durumunu alıyoruz.
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // Network durumunu alıyoruz.
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // Kullanılabilir bir Network sağlayıcı yok!
            } else {
                this.canGetLocation = true;
                // İlk önce! -> Network sağlayıcıdan konum bilgisini al.
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // GPS aktif ise enlem ve boylam değerlerini al. (lat / long)
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Aktif", "GPS Aktif");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }
    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

2.3. Daha bitmedi, enlem ve boylam değerlerini alacağımız metodları da yukarıda yaptığımız gibi class’ a dahil edelim.

/**
     * Enlemi al.
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Boylamı al.
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

3. Kullanıcı ile iletişim: GPS Erişimine İzin Ver. (Sistem ayarlarını değiştirme)

/**
     * En iyi Network sağlayıcıyı kontrol eden fonksiyon.
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * GPS Erişimi için kullanılacak olan fonksiyon.
     * */
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Dialog başlığı ayarlama.
        alertDialog.setTitle("GPS is settings");

        // Dialog içeriğinde gösterilecek olan mesaj.
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // Dialog için icon ayarlama.
        //alertDialog.setIcon(R.drawable.delete);

        // Settings butonuna basıldığı zaman...
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });

        // Cancel buttonuna basıldığı zaman...
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });

        // Alert Message gösterimi.
        alertDialog.show();
    }

Peki GPS ile iletişimi kesmek istersek ne yapacağız, onu da yazalım:

/**
     * GPS' i durdur.
     * Bu metodun çağırılması durumunda GPS deaktif olacak.
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

Son olarak GPSTracker.java:

package your-package;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // GPS durumunu kontrol eden durum, başlangıç olarak false.
    boolean isGPSEnabled = false;

    // Network durumunu kontrol eden durum, başlangıç olarak false.
    boolean isNetworkEnabled = false;

    boolean canGetLocation = false;

    Location location; // location, konum.
    double latitude; // latitude, enlem,
    double longitude; // longitude, boylam.

    // Değişikliğin kaç metrede bir yapılacağını gösteren değer.
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 metre

    // Milisaniye bazında güncellemeler arasındaki en küçük zaman dilimi
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 dakika

    // Location Manager tanımlıyoruz.
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // GPS durumunu alıyoruz.
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // Network durumunu alıyoruz.
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // Kullanılabilir bir Network sağlayıcı yok!
            } else {
                this.canGetLocation = true;
                // İlk önce! -> Network sağlayıcıdan konum bilgisini al.
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // GPS aktif ise enlem ve boylam değerlerini al. (lat / long)
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Aktif", "GPS Aktif");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

    /**
     * Enlemi al.
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Boylamı al.
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * GPS' i durdur.
     * Bu metodun çağırılması durumunda GPS deaktif olacak.
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * En iyi Network sağlayıcıyı kontrol eden fonksiyon.
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * GPS Erişimi için kullanılacak olan fonksiyon.
     * */
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Dialog başlığı ayarlama.
        alertDialog.setTitle("GPS is settings");

        // Dialog içeriğinde gösterilecek olan mesaj.
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // Dialog için icon ayarlama.
        //alertDialog.setIcon(R.drawable.delete);

        // Settings butonuna basıldığı zaman...
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });

        // Cancel buttonuna basıldığı zaman...
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });

        // Alert Message gösterimi.
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

– Kullanım –

Main activity class’ ınızı açın ve aşağıdaki kodlar yazın:

GPS aktif veya deaktif

GPSTracker gps = new GPSTracker(this);
if(gps.canGetLocation()){ // gps aktif} // return boolean true/false

Enlem ve Boylam değerlerini alma

gps.getLatitude(); // enlem değerini döndürür.
gps.getLongitude(); // boylam değerini döndürür.

GPS Ayarlar Dialog Penceresi

gps.showSettingsAlert();

GPS’ i durdur

gps.stopUsingGPS();

Son olarak main activity: AndroidGPSTrackingActivity.java

package your-package;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class AndroidGPSTrackingActivity extends Activity {

    Button btnShowLocation;

    // GPSTracker class
    GPSTracker gps;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);

        // Button click olayı.
        btnShowLocation.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // create class object
                gps = new GPSTracker(AndroidGPSTrackingActivity.this);

                // GPS' nin aktif olması kontrolü.
                if(gps.canGetLocation()){

                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();

                    // \n is for new line
                    Toast.makeText(getApplicationContext(), "Konumunuz - \nEnlem: " + latitude + "\nBoylam: " + longitude, Toast.LENGTH_LONG).show();
                }else{
                    // Konuma ulaşılamıyor..!
                    // GPS veya Network kullanılabilir değil..!
                    // Ayarları aktifleştirmesi için kullanıcı ile iletişime geç.
                    gps.showSettingsAlert();
                }

            }
        });
    }

}

Uygulamayı Test Etme Aşaması

Eğer gerçek bir cihaz kullanıyorsanız, sorun yok, uygulama direk olarak çalışacaktır. Emülatörde bir sonuç görmek istiyorsanız, Eclipse için DDMS görünümüne geçmeniz gerekiyor.
Windows –> Open Perspective –> Other –> DDMS
Daha sonra Emulator Control Tab içerisinde enlem ve boylam değerlerini el ile belirleyebilirsiniz.

Ekran görüntüsü:

Reklamlar

04 Eki 2012 tarihinde Android içinde yayınlandı ve , , , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin. 7 Yorum.

  1. Merhaba, yazınız gerçekten çok güzel tebrik ederim. Uygulamanızı yapmaya çalıştım ama bir sorunum var. Butona tıkladığımda “the application tasarimP has stopped unexpectedly. please try again. ” uyarısı alıyorum. Nedenini bulamıyorum, yardımcı olursanız çok sevinirim. Şimdiden teşekkürler 🙂

    • Merhaba, “the application … has stopped ” hatasını çözmek için LogCat penceresinden uyarıları takip edebilirsiniz. Siz bana orada yazanları söyleyin eğer çözemezseniz yardımcı olmaya çalışayım.
      Eğer LogCat penceresi nerede diyorsanız:
      Window -> Show View -> LogCat
      Görünmüyor ise şayet:
      Window -> Show View -> Other -> Android -> LogCat

  2. Android’de çok yeniyim dolayısıyla çözemedim..

    10-25 21:02:03.104: D/AndroidRuntime(286): Shutting down VM
    10-25 21:02:03.116: W/dalvikvm(286): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
    10-25 21:02:03.134: E/AndroidRuntime(286): FATAL EXCEPTION: main
    10-25 21:02:03.134: E/AndroidRuntime(286): java.lang.NullPointerException
    10-25 21:02:03.134: E/AndroidRuntime(286): at com.android.internal.app.AlertController$AlertParams.(AlertController.java:743)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.app.AlertDialog$Builder.(AlertDialog.java:273)
    10-25 21:02:03.134: E/AndroidRuntime(286): at com.example.tasarimprojesi2.GPSTracket.showSettingsAlert(GPSTracket.java:155)
    10-25 21:02:03.134: E/AndroidRuntime(286): at com.example.tasarimprojesi2.MainActivity$1.onClick(MainActivity.java:44)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.view.View.performClick(View.java:2408)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.view.View$PerformClick.run(View.java:8816)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.os.Handler.handleCallback(Handler.java:587)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.os.Handler.dispatchMessage(Handler.java:92)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.os.Looper.loop(Looper.java:123)
    10-25 21:02:03.134: E/AndroidRuntime(286): at android.app.ActivityThread.main(ActivityThread.java:4627)
    10-25 21:02:03.134: E/AndroidRuntime(286): at java.lang.reflect.Method.invokeNative(Native Method)
    10-25 21:02:03.134: E/AndroidRuntime(286): at java.lang.reflect.Method.invoke(Method.java:521)
    10-25 21:02:03.134: E/AndroidRuntime(286): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    10-25 21:02:03.134: E/AndroidRuntime(286): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    10-25 21:02:03.134: E/AndroidRuntime(286): at dalvik.system.NativeStart.main(Native Method)

    • Kodlarda her hangi bir değişiklik yapıp yapmadığınızı bilmiyrum, fakat çıktıda belirtilen yer ( GPSTracket.java:155 )
      yani GPSTracket.java içerisinde 155. satırda hata var demek oluyor.
      Hataya tekrar bakın, emülatörde çalışıyorsanız internete bağlı olduğunuza emin olun. Default olarak 3G bağlantısı her zaman açıktır fakat pc den kontrolü yapın.

  3. İlgilendiğiniz için teşekkür ederim..

  4. LogCat deki uyarıları takip et derken tam olarak neyi kastediyorsunuz..Ben uyarı filan görmedim.Has stopped unex…. hatasını bennde aldım…

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: