Android Konum İşlemleri

Android işletim sistemi bir çok sensörü desteklediğinden GPS sensörünü de destekler. GPS üzerinden veri klasik sensör erişimi ile yapılmaz. Aslında Android OS'ta konum bilgisi 3 kaynaktan elde edilebilir.

  • GPS Sensörü
  • Hücresel Ağ
  • Wifi

Konum Bilgisinin GPS/Hücresel Ağ/Wifi ile Elde Edilmesi

Bilindiği gibi dünya üzerinde konum bilgisi enlem ve boylam isimli bilgilerden oluşmaktadır.(longtitude, latitude) Bu işlem için ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION izinleri gerekmektedir. Bu izinler "tehlikeli izinler" durumundadır.

Konum işlemleri için LocationManager ve LocationListener isimli 2 tane sınıf bulunmaktadır. LocationManager referansı Context sınıfının getSystemService() metoduna Context.LOCATION_SERVICE sabitinin geçilmesiyle elde edilebilir. LocationListener nesnesi ise tipik olarak LocationListener arayüzünü implemente eden bir sınıf türünden nesne olarak elde edilebilir.

LocationListener arayüzünün onLocationChanged(), onProviderDisabled(), onProviderEnabled() ve onStatusChanged() isimli metodları bulunmaktadır. Bu metodlardan onLocationChange() metodu Location sınıfı türünden bir parametreye sahiptir. Location sınıfının getLatitude metodu ile enlem, getLongtitude metodu ile o anki boylam bilgileri elde edilebilir.

Bir Listener nesnesi yaratılarak LocationManager sınıfının requestLocationUpdates() metodu ile dinlemenin hangi kaynaktan yapılacağı belirlenebilir.

Anahtar Notlar:

  1. Konum bilgisi en iyi hassasiyetle GPS sensöründen elde edilebilir. Network kaynağından erişimde genel olarak "Hücresel Ağ" Wifi'ya göre daha iyidir.
  2. Network kaynağından konum bilgisi almak için ACCESS_COARSE_LOCATION izni, GPS sensöründen almak için ise ACCESS_FINE_LOCATION izni gerekmektedir.

LocationListener arayüzünün onStatusChange() metodu kaynağın herhangi bir durumda problem oluştuğunda çağrılmaktadır. Buna göre kaynak üzerindeki değişim durumu aşağıdaki gibi bir kodla takip edilebilir.


        @Override
        public void onStatusChanged(String provider, int status, Bundle extras)
        {
            String message = "";

            switch (status) {
                case LocationProvider.AVAILABLE:
                    message = "Available";
                    break;
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    message = "Temporarily unavailable";
                    break;
                case LocationProvider.OUT_OF_SERVICE:
                    message = "Out of service";
                    break;
            }

            Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
        }

Anahtar Notlar: Konum bilgisi erişimi cihazın pilinden oldukça fazla harcamaktadır, dolayısıyla herhangi bir özel durum yoksa, Activity onPause durumuna geçtiğinde LocationManager sınıfının removeUpdates() isimli metodu ile dinleme işlemi durdurulmalıdır.

LocationListener arayüzünün onProviderEnabled() ve onProviderDisabled() metotları cihazın cihazın konum bilgisi elde etme özelliği açık veya kapalı olduğu durumda çağrılmaktadır.