2013-03-16 11 views
5

GPS'in şu anda bir şey yapıp yapmadığını öğrenmek için Android'de (GingerBread) bir yol olup olmadığını öğrenmek istiyorum. Bana biraz daha açık olalım:Android: GPS'in arama yaptığını, düzeltildiğini veya kullanımda olmadığını kontrol edin

üzerine statusbar (GPS simgesi) Sabit

1)
2) düzeltme aranıyor (GPS simgesi: Ben temelde GPS wheter söyle bazı yöntem veya api aramak istediğiniz statusbar yanıp sönme) üzerinde
3) Aktif olmayan (uygulama Şimdi şu anda statusbar'da, hiçbir simge)

konum hizmetlerini kullanarak: Ben bu tür değişiklikler haberdar olmak için bir LocationListener kullanabileceğinizi biliyor AMA bu iyi değil Benim için kodumun beklemesini beklemiyorum çünkü olayları beklemeyi bekliyorum, kodum düzenli aralıklarla zamanlanmış olarak çalışıyor, bir şeyler yapıyor ve daha sonra bitiyor, bu yüzden GPS servisinin durumunu o anda tam olarak kontrol etmenin bir yoluna ihtiyacım var. ziyade değiştiğinde bildirimleri bekle.

+0

Belki bu işe yarıyor mu? http://stackoverflow.com/a/3712727/1318830 –

+0

Bu kodu test etmedim, ancak baktığımda normal olanı görüyor: GPS Durumunda Değişen bir etkinlik için abone oluyor ve bekler. Yapmak istediğim şey şu anki durumu hemen bilmektir, örneğin mevcut durumu geri getirecek bir yöntem/api çağırmak gibi. –

+0

Bu satırda, genel olarak http: // stackoverflow gibi nasıl kullanabileceğinizi daha geniş bir bakış açısı veren birçok cevap var.com/a/4084800/1318830 –

cevap

12

GPS üzerinde çok fazla test yaptıktan sonra, sonunda çözümü buldum. Android uygulaması arama yöneticisi ve GPS arama yapmaya başladığında, bir olay tetiklenir ve gps kilitli olduğunda da başka bir olay tetiklenir. Aşağıdaki kod, bunun nasıl yapıldığını gösterir.

locationManager = (LocationManager)mContext.getSystemService(LOCATION_SERVICE); 
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    if (isGPSEnabled) {     
     if (locationManager != null) { 
      // Register GPSStatus listener for events 
      locationManager.addGpsStatusListener(mGPSStatusListener); 
      gpslocationListener = new LocationListener() { 
       public void onLocationChanged(Location loc) {} 
       public void onStatusChanged(String provider, int status, Bundle extras) {} 
       public void onProviderEnabled(String provider) {} 
       public void onProviderDisabled(String provider) {}       
      }; 

       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
       MIN_TIME_BW_UPDATES_GPS, MIN_DISTANCE_CHANGE_FOR_UPDATES_GPS, 
       gpslocationListener);   
     } 
    } 

/* Bu * GPS durdu başlamış gibi çeşitli etkinlikler ortaya çıktığında GPSListener işlevi çağrıldığında ise, GPS O GPS kodu koymak için daha iyidir */

public Listener mGPSStatusListener = new GpsStatus.Listener() { 
    public void onGpsStatusChanged(int event) {  
     switch(event) { 
      case GpsStatus.GPS_EVENT_STARTED: 
       Toast.makeText(mContext, "GPS_SEARCHING", Toast.LENGTH_SHORT).show(); 
       System.out.println("TAG - GPS searching: ");       
       break; 
      case GpsStatus.GPS_EVENT_STOPPED:  
       System.out.println("TAG - GPS Stopped"); 
       break; 
      case GpsStatus.GPS_EVENT_FIRST_FIX: 

       /* 
       * GPS_EVENT_FIRST_FIX Event is called when GPS is locked    
       */ 
        Toast.makeText(mContext, "GPS_LOCKED", Toast.LENGTH_SHORT).show(); 
        Location gpslocation = locationManager 
          .getLastKnownLocation(LocationManager.GPS_PROVIDER); 

        if(gpslocation != null) {  
        System.out.println("GPS Info:"+gpslocation.getLatitude()+":"+gpslocation.getLongitude()); 

        /* 
        * Removing the GPS status listener once GPS is locked 
        */ 
         locationManager.removeGpsStatusListener(mGPSStatusListener);     
        }    

       break; 
      case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
//     System.out.println("TAG - GPS_EVENT_SATELLITE_STATUS"); 
       break;     
     } 
    } 
}; 

kilitli * ve GPS konum bilgisi almak için servis olarak.

Her zaman, GPS işlevini çağırırsanız, GPSStatus dinleyicisi kaydedilir. GPS_SEARCHING tost, GPS aramaya başladığında sadece bir kez gelir ve GPS kilitliyken GPS_LOCKED tost ekranı görüntülenir. GPS fonksiyonunu tekrar ararsak, GPS_EVENT_FIRST_FIX olayı kilitliyse (GPS_LOCKED tost'unu gösterir) ve GPS aramaya başladıysa GPS_SEARCHING toastını göstermez (örn. GPS_STARTED olay tetiklenmez). GPS_EVENT_FIRST_FIX olayı tetiklendikten sonra GPSstatus dinleyicisi güncellemelerini kaldırıyorum.

GPS_EVENT_FIRST_FIX olayı tetiklendiğinde, en yeni GPS düzeltmesini almak için gpslastknownlocation() işlevini çağırmak daha iyidir. (Daha fazla bilgi için Android geliştiricileri sitesine bakmak daha iyidir).

Umarım bu başkalarına yardımcı olur ....

+0

Artık buna ihtiyacım yok ve bunu test etmek için zamanım yok, ama cevabı kabul ediyorum, zaman ve çaba için teşekkürler. –

+2

GPS durumu kilitlendikten sonra kilidi açıldığında bir işlevi tetiklemek istiyorum. Bunu nasıl yapabilirim ? – ssrp

1

Maalesef, Android'de GPS’in "mevcut durumunu" almanın kolay bir yolu yoktur. Diğerlerinin de belirttiği gibi, en iyi bahsiniz onGpsStatusChanged() etkinliğine kaydolmak ve durumu takip etmektir.

Macera dolu hissediyorsanız, gps sağlayıcısının durumunu öğrenmek için adb kabuğundan $ dumpsys location numaralı telefonu arayabilirsiniz. Genellikle masaüstünüzden $ adb shell'u arayın, ancak yerel bir android kabuk uygulamasını derleyebilir ve exec()'u telefonun içinden doğrudan dumpsys çıkışını almak için çağırabilirsiniz.

+0

ve bunu GPS bilgilerini almanın normal yolunu mu düşünüyorsunuz? – axd

İlgili konular