GPS alıcısının mevcut durumunu nasıl kontrol edebilirim?


90

GPS alıcısının mevcut durumunu nasıl kontrol edebilirim? LocationListener onStatusChangedYöntemi zaten kontrol ettim ama bir şekilde işe yaramıyor veya yanlış olasılık gibi görünüyor.

Temel olarak, ekranın üst kısmındaki GPS simgesinin yanıp söndüğünü (gerçek düzeltme yok) veya sabit (düzeltme mevcut) olup olmadığını bilmem gerekiyor.

Yanıtlar:


150

Bir SpeedView geliştiricisi olarak: Android için GPS hız göstergesi, bu soruna mümkün olan her çözümü denemiş olmalıyım, hepsi aynı olumsuz sonuçla. Neyin işe yaramadığını tekrarlayalım:

  1. onStatusChanged (), Eclair ve Froyo'da çağrılmıyor.
  2. Elbette mevcut tüm uyduları saymak işe yaramaz.
  3. Uydulardan herhangi birinin usedInFix () için true dönüp dönmediğini kontrol etmek de çok yardımcı olmuyor. Sistem düzeltmeyi açıkça kaybediyor, ancak içinde hala kullanılan birkaç uydu olduğunu bildirmeye devam ediyor.

İşte bulduğum tek çalışan çözüm ve uygulamamda gerçekten kullandığım çözüm. Diyelim ki GpsStatus.Listener'ı uygulayan bu basit sınıfa sahibiz:

private class MyGPSListener implements GpsStatus.Listener {
    public void onGpsStatusChanged(int event) {
        switch (event) {
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                if (mLastLocation != null)
                    isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

                if (isGPSFix) { // A fix has been acquired.
                    // Do something.
                } else { // The fix has been lost.
                    // Do something.
                }

                break;
            case GpsStatus.GPS_EVENT_FIRST_FIX:
                // Do something.
                isGPSFix = true;

                break;
        }
    }
}

Tamam, şimdi onLocationChanged () 'e aşağıdakileri ekliyoruz:

@Override
public void onLocationChanged(Location location) {
    if (location == null) return;

    mLastLocationMillis = SystemClock.elapsedRealtime();

    // Do something.

    mLastLocation = location;
}

Ve bu kadar. Temel olarak, her şeyi yapan satır budur:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

Elbette milis değerini değiştirebilirsiniz, ancak bunu 3-5 saniye civarında ayarlamanızı öneririm.

Bu gerçekten işe yarıyor ve yerel GPS simgesini çizen kaynak koduna bakmamış olsam da, bu, davranışını kopyalamaya yaklaşıyor. Umarım bu birine yardımcı olur.


Merhaba, bu örnekte olduğu gibi mevcut uyduları saymanın neden yararsız olduğunu merak ediyorum? Bulunan uydu sayısı 0 ise bağlantı yok demektir, yoksa yanılıyor muyum? groups.google.com/group/android-developers/browse_thread/thread/…
per_jansson

3
Merhaba Stephen, lütfen isGPSFix'in neden çalıştığını açıklar mısınız? Teşekkürler, Nick
nickfox

Bu arada, ICS'de sistemin GPS düzeltmesinin kaybolduğunu bildirmeye başlaması için süreyi artırdıklarını fark ettim. En azından 4.0.3'te tam olarak 10 saniye.
soundmaven

Harika çalışıyor ve ICS için 3-5 yerine 10 saniye kullanmak da oldukça iyi çalışıyor. Neyse ki düzeltme, uygulamam için gerekli bir özellik değil, ancak bunu bilmek güzel. Teşekkürler.
Tom

1
Ancak bu mLastLocationMillis, GPS dışında bir kaynak tarafından ayarlandığında bozulmaz mı? Sistem bunun isGPSFixdoğru olduğunu iddia ederdi , ancak gerçekte herhangi biri bir düzeltme (telefon ağından belki bir)
Avalancha

25

GPS simgesi, alınan yayın amaçlarına göre durumunu değiştiriyor gibi görünüyor. Aşağıdaki kod örnekleriyle durumunu kendiniz değiştirebilirsiniz:

GPS'in etkinleştirildiğini bildirin:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

GPS'in düzeltmeler aldığını bildirin:

Intent intent = new Intent("android.location.GPS_FIX_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

GPS'in artık düzeltmeler almadığını bildirin:

Intent intent = new Intent("android.location.GPS_FIX_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

GPS'in devre dışı bırakıldığını bildirin:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

Alıcıyı amaçlara kaydetmek için örnek kod:

// MyReceiver must extend BroadcastReceiver
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("android.location.GPS_ENABLED_CHANGE");
filter.addAction("android.location.GPS_FIX_CHANGE");
registerReceiver(receiver, filter);

Bu yayın amaçlarını alarak GPS durumundaki değişiklikleri fark edebilirsiniz. Ancak, yalnızca durum değiştiğinde bilgilendirileceksiniz. Dolayısıyla bu niyetleri kullanarak mevcut durumu belirlemek mümkün değildir.


Bu yayını uygulamanızdan nasıl gönderebileceğinizi bilmiyorum çünkü bu sistem korumalı bir yayın gibi görünüyor, yani sadece sistem onu ​​gönderebilir. Bu amacı gönderen herhangi bir uygulama çökmelidir.
JoxTraex

Altı yıl önce, cevabı yazdığımda göndermek mümkündü. Görünüşe göre o zamandan beri sisteme bir miktar koruma eklediler.
2016

Diğer uygulamaların GPS'i ne zaman kullandığını söylemek için bu amaçları kullanıyordum. Nougat'tan başlayarak, artık bu niyetleri dinleyemezsiniz, bu ya da değiştiğine inanıyorum! Kendi uygulamamla konumu dinlemek istemiyorum. Başka bir fikri olan var mı?
Flyview

Evet, o çökmeyi yaşadım: 05-14 10: 25: 24.113 17344-17344 / xxx.yyy.zzz.debug E / AndroidÇalışma Zamanı: FATAL EXCEPTION: ana İşlem: xxx.yyy.zzz.debug, PID: 17344 java. lang.SecurityException: İzin Reddi: pid = 17344, uid = 10416
sınırsız101

19

yeni üye bu yüzden ne yazık ki yorum yapamıyorum veya oy veremiyorum, ancak Stephen Daye'nin yukarıdaki gönderisi, yardım aradığım sorunun aynısı için mükemmel bir çözümdü.

aşağıdaki satırda küçük bir değişiklik:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

to:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

temelde yavaş tempolu bir oyun oluşturduğumda ve güncelleme aralığım zaten 5 saniyeye ayarlıyken, gps sinyali 10 saniyeden fazla kesildiğinde, bir şeyi tetiklemek için doğru zaman budur.

şerefe dostum, gönderinizi bulmadan önce bu çözümü çözmeye çalışmak için yaklaşık 10 saat harcadım :)


14

Tamam, şimdiye kadarki tüm cevapların ve güncellemelerin bir kombinasyonunu deneyelim ve şöyle bir şey yapalım:

GPS dinleyicisi şunun gibi bir şey olabilir:

GpsStatus.Listener listener = new GpsStatus.Listener() {
    void onGpsStatusChanged(int event) {
        if (event == GPS_EVENT_SATELLITE_STATUS) {
            GpsStatus status = mLocManager.getGpsStatus(null);
            Iterable<GpsSatellite> sats = status.getSatellites();
            // Check number of satellites in list to determine fix state
        }
    }
}

API'ler ne zaman ve hangi GPS ve uydu bilgilerinin verildiği konusunda biraz belirsiz, ancak bence kaç tane uydunun mevcut olduğuna bakmak bir fikir olabilir. Üçün altındaysa, bir düzeltme yapamazsınız. Eğer daha fazlaysa, bir düzeltme almalısınız.

Deneme ve yanılma, muhtemelen Android'in uydu bilgilerini ne sıklıkla bildirdiğini ve her GpsSatellitenesnenin hangi bilgileri içerdiğini belirlemenin yoludur .


Mevcut uyduların sayılmasıyla ilgili sorun, 5 uydunuz olsa bile, bu her zaman bir düzeltmenin mümkün olduğu anlamına gelmez. ("Daha
fazlaysa

Aslında. Bir düzeltme oluşturmak için hangi bilgilerin gerekli olduğu veya bunun bir GpsSatellitenesneden nasıl / alınabileceği hakkında daha fazla bilgi sahibi olmasam da .
Christopher Orr

Başka bir düşünce… Sorunuzda bundan bahsetmiyorsunuz, ancak sadece LocationManager.requestLocationUpdateszaman ve mesafe ayarlarını 0 olarak ayarlayarak kullanmayı denediniz mi? Bu, GPS düzeltmelerini olur olmaz size göndermelidir. Hiçbir şey almıyorsanız, büyük olasılıkla bir düzeltmeniz yoktur. İsterseniz bunu yukarıdaki durum dinleyicisiyle birleştirebilirsiniz.
Christopher Orr

1
"Sats" ı yinelemek ve GpsSatellite'de usedInFix () 'i kontrol etmek belki?
DeliriumTremens

8

Windows mobil cihazlarda GPS ile birkaç yıl çalıştıktan sonra, bir GPS düzeltmesini "kaybetme" kavramının öznel olabileceğini fark ettim. GPS'in size söylediklerini basitçe dinlemek için, bir NMEAListener eklemek ve cümleyi çözümlemek size düzeltmenin "geçerli" olup olmadığını söyleyecektir. Bkz. Http://www.gpsinformation.org/dale/nmea.htm#GGA . Ne yazık ki bazı GPS'lerde bu değer, "iyi sabitlenmiş" bir alanda normal çalışma sırasında bile ileri geri dalgalanacaktır.

Dolayısıyla, diğer çözüm, GPS konumunun UTC saatini telefonun saatiyle (UTC'ye dönüştürülmüş) karşılaştırmaktır. Aralarında belirli bir zaman farkı varsa, GPS konumunu kaybettiğinizi varsayabilirsiniz.


Zaman karşılaştırma yöntemini açıklar mısınız? Stephen Daye'nin cevabında, son düzeltmenin gerçekleştiği zaman ile en son GPS_EVENT_SATELLITE_STATUS olayı arasındaki zaman farklarını karşılaştırdı ... Ne ölçtüğünden emin değil.
Rokey Ge

7

MSc projem üzerinde çalışırken benzer bir sorunla karşılaşıyorum, cihaz statik bir konumda kalırken Daye'nin cevabının yanlışlıkla "düzeltme yok" olarak bildirildiği görülüyor. Çözümü biraz değiştirdim, bu benim için statik bir konumda iyi çalışıyor gibi görünüyor. Asıl endişem olmadığı için pili nasıl etkileyeceğini bilmiyorum, ancak işte bir düzeltme zaman aşımına uğradığında konum güncellemelerini yeniden talep ederek bunu nasıl yaptım.

private class MyGPSListener implements GpsStatus.Listener {
    public void onGpsStatusChanged(int event) {
        switch (event) {
        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            if (Global.getInstance().currentGPSLocation != null)
            {
                if((SystemClock.elapsedRealtime() - mLastLocationMillis) < 20000)
                {
                    if (!hasGPSFix) 
                        Log.i("GPS","Fix Acquired");
                    hasGPSFix = true;
                } 
                else
                {
                    if (hasGPSFix) 
                    {
                        Log.i("GPS","Fix Lost (expired)");
                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
                    }
                    hasGPSFix = false;
                }
            }
            break;
        case GpsStatus.GPS_EVENT_FIRST_FIX:
            Log.i("GPS", "First Fix/ Refix");
            hasGPSFix = true;
            break;
        case GpsStatus.GPS_EVENT_STARTED:
            Log.i("GPS", "Started!");
            break;
        case GpsStatus.GPS_EVENT_STOPPED:
            Log.i("GPS", "Stopped");
            break;
        }
    }
}

5

Pekala, her çalışma yaklaşımını bir araya getirmek, bununla sonuçlanacaktır (ayrıca kullanımdan kaldırılanla da ilgilenmek GpsStatus.Listener):

private GnssStatus.Callback mGnssStatusCallback;
@Deprecated private GpsStatus.Listener mStatusListener;
private LocationManager mLocationManager;

@Override
public void onCreate() {
    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (checkPermission()) {
       mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_UPDATE_INTERVAL, MIN_DISTANCE, this);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        mGnssStatusCallback = new GnssStatus.Callback() {
            @Override
            public void onSatelliteStatusChanged(GnssStatus status) {
                satelliteStatusChanged();
            }

            @Override
            public void onFirstFix(int ttffMillis) {
                gpsFixAcquired();

            }
        };
        mLocationManager.registerGnssStatusCallback(mGnssStatusCallback);
    } else {
        mStatusListener = new GpsStatus.Listener() {
            @Override
            public void onGpsStatusChanged(int event) {
                switch (event) {
                    case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                        satelliteStatusChanged();
                        break;
                    case GpsStatus.GPS_EVENT_FIRST_FIX:
                        // Do something.
                        gpsFixAcquired();
                        break;
                }
            }
        };
        mLocationManager.addGpsStatusListener(mStatusListener);
    }
}

private void gpsFixAcquired() {
    // Do something.
    isGPSFix = true;
}

private void satelliteStatusChanged() {
    if (mLastLocation != null)
        isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

    if (isGPSFix) { // A fix has been acquired.
        // Do something.
    } else { // The fix has been lost.
        // Do something.
    }
}

@Override
public void onLocationChanged(Location location) {
    if (location == null) return;

    mLastLocationMillis = SystemClock.elapsedRealtime();

    mLastLocation = location;
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}

Not: Bu cevap, yukarıdaki cevapların bir kombinasyonudur.


1
Diğer yazar (lar) a atıfta bulunduğunuz sürece, yeni veya türev çalışmalar için kendi oylarınızı almakta sorun yoktur. Buradaki kurallar, daha çok, diğer insanların cevaplarını çalmak ve bunları sahtekar bir şekilde temsilciyi çekmek için Stack Overflow'da başka yerlerde kullanmakla ilgilidir. Başka cevaplar üzerine inşa ettiğinden bahsettiğine göre, bunun iyi olduğunu düşünüyorum.
2017

3

Yalnızca bir düzeltme olup olmadığını bilmeniz gerekiyorsa, GPS alıcısı tarafından sağlanan son bilinen konumu kontrol edin ve bunun kaç yaşında olduğunu öğrenmek için .getTime () değerini kontrol edin. Yeterince yeniyse (birkaç saniye gibi) bir düzeltmeniz var.

   LocationManager lm = (LocationManager)context.getSystemService(LOCATION_SERVICE); 
   Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

   // Get the time of the last fix
   long lastFixTimeMillis = loc.getTime(); 

... ve son olarak bunu güncel tarih saatiyle karşılaştırın (UTC olarak!). Yeterince yeni ise, bir düzeltmeniz var.

Bunu uygulamamda yapıyorum ve şimdiye kadar çok iyi.


Bir düzeltme olup olmadığını hemen öğrenmek istiyorsanız +1 denemeye değer görünüyor.
AgentKnopf


2

Yanılıyor olabilirim ama görünüşe göre insanlar konu dışı kalıyor

sadece ekranın üst kısmındaki gps simgesinin yanıp söndüğünü bilmem gerekiyor (gerçek düzeltme yok)

Bu kolayca yapılır

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_on = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

Sağlam bir düzeltmeniz olup olmadığını görmek için işler biraz daha karmaşık hale gelir:

public class whatever extends Activity {
    LocationManager lm;
    Location loc;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        loc = null;
        request_updates();        
    }

    private void request_updates() {
        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            // GPS is enabled on device so lets add a loopback for this locationmanager
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, locationListener);
        }      
    }

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Each time the location is changed we assign loc
            loc = location;
        }

         // Need these even if they do nothing. Can't remember why.
         public void onProviderDisabled(String arg0) {}
         public void onProviderEnabled(String provider) {}
         public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

Şimdi ne zaman düzelip düzelmediğini görmek istersen?

if (loc != null){
    // Our location has changed at least once
    blah.....
}

Süslü olmak istiyorsanız System.currentTimeMillis () ve loc.getTime () kullanarak her zaman bir zaman aşımına sahip olabilirsiniz.

Güvenilir bir şekilde çalışır, en azından 2.1'den beri bir N1'de.


3
Çözümünüz, yaptığı şey için aşırı karmaşık. Ancak çok az şey yapıyor. Ya gps konumumu çözdükten sonra yeraltı istasyonuna gidip gps'in düzeltmeyi kaybetmesine neden olursa?
meandre

1

LocationManager ile, getBestProvider () aldıktan sonraLastKnownLocation () alabilirsiniz. Bu size metre cinsinden getAccuracy () ve UTC milisaniye cinsinden getTime () yöntemlerine sahip bir Location nesnesi verir.

Bu size yeterince bilgi veriyor mu?

Veya belki de LocationProviders üzerinde yineleme yapabilir ve her birinin Kriterleri karşılayıp karşılamadığını öğrenebilirsiniz (ACCURACY_COARSE)


1

çok fazla gönderi ...

GpsStatus.Listener gpsListener = new GpsStatus.Listener() {
                        public void onGpsStatusChanged(int event) {
                            if( event == GpsStatus.GPS_EVENT_FIRST_FIX){
                                showMessageDialog("GPS fixed");
                            }
                        }
                 };

addGpsListener ile bu kod ekleniyor ... showMessageDialog ... sadece dizeyi içeren standart bir iletişim penceresi gösterir

işi benim için mükemmel yaptı :) çok teşekkürler: =) (bu yazı için üzgünüm, henüz oy veremiyorum)


Bu sadece ilk çözüm. Ya bir tünele girerseniz?
Leos Literak

1

Düzeltmenin kaybolduğu anda bir güncellemeye ihtiyacınız yoksa Stephen Daye'nin çözümünü, düzeltmenin hala mevcut olup olmadığını kontrol eden bir yönteme sahip olacak şekilde değiştirebilirsiniz.

Böylece, bazı GPS verilerine ihtiyaç duyduğunuzda kontrol edebilirsiniz ve bu GpsStatus.Listener'a ihtiyacınız yoktur.

"Genel" değişkenler şunlardır:

private Location lastKnownLocation;
private long lastKnownLocationTimeMillis = 0;
private boolean isGpsFix = false;

Bu, güncelleme zamanını ve geçerli konumu hatırlamak için "onLocationChanged ()" içinde çağrılan yöntemdir. Ayrıca "isGpsFix" i günceller:

private void handlePositionResults(Location location) {
        if(location == null) return;

        lastKnownLocation = location;
        lastKnownLocationTimeMillis = SystemClock.elapsedRealtime();

        checkGpsFix(); // optional
    }

Bu yöntem, bir GPS düzeltmesi olup olmadığını bilmem gerektiğinde çağrılır:

private boolean checkGpsFix(){

    if (SystemClock.elapsedRealtime() - lastKnownLocationTimeMillis < 3000) {
        isGpsFix = true;

    } else {
        isGpsFix = false;
        lastKnownLocation = null;
    }
    return isGpsFix;
}

Uygulamamda ilk olarak checkGpsFix () 'i çalıştırıyorum ve sonuç doğruysa "lastKnownLocation" değişkenini mevcut konumum olarak kullanıyorum.


1

Bunun biraz geç olduğunu biliyorum. Ancak bir düzeltmeniz olup olmadığını öğrenmek istiyorsanız neden NMEAListener'ı kullanmıyorsunuz? Okuduklarımdan, NMEAListener size NMEA cümlelerini verecek ve oradan doğru cümleyi seçeceksiniz.

RMC cümlesi, Tamam için A veya uyarı için V olan düzeltme durumunu içerir. GGA cümlesi Sabit Kaliteyi içerir (0 geçersiz, 1 GPS veya 2 DGPS)

Android ile yeni başladığım için size herhangi bir java kodu sunamıyorum, ancak Xamarin ile kullanmak istediğim Windows uygulamaları için C #'da bir GPS kitaplığı yaptım. Bu konuya yalnızca sağlayıcı bilgilerini aradığım için rastladım.

Şu ana kadar Location nesnesi hakkında okuduğum kadarıyla getAccuracy () ve hasAccuracy () gibi yöntemler konusunda pek rahat değilim. Düzeltmelerimin ne kadar doğru olduğunu belirlemek için NMEA cümlelerinden HDOP ve VDOP değerlerini çıkarmaya alışkınım. Bir düzeltmeye sahip olmak oldukça yaygındır, ancak kötü bir HDOP'ye sahip olmak, yatay doğruluğunuzun hiç de iyi olmadığı anlamına gelir. Örneğin, bir pencereye sabitlenmiş harici bir Bluetooth GPS cihazıyla masanızda otururken, bir düzeltme elde etme olasılığınız oldukça yüksektir, ancak çok zayıf HDOP ve VDOP. GPS cihazınızı dışarıdaki bir saksıya veya benzeri bir şeye yerleştirin veya GPS'e harici bir anten ekleyin ve anında iyi HDOP ve VDOP değerleri elde edin.


0

Belki de alınan Konumu belirli bir değere (boş?) Düzenli olarak ayarlayan bir TimerTask oluşturmak en iyi olasılıktır. GPSListener tarafından yeni bir değer alınırsa, konumu mevcut verilerle güncelleyecektir.

Bunun çalışan bir çözüm olacağını düşünüyorum.


0

Zaten onStatusChanged () 'i denediğini söylüyorsun, ama bu benim için çalışıyor.

İşte kullandığım yöntem (sınıfın kendisinin onStatusChanged'yi işlemesine izin veriyorum):

private void startLocationTracking() {
    final int updateTime = 2000; // ms
    final int updateDistance = 10; // meter
    final Criteria criteria = new Criteria();
    criteria.setCostAllowed(false);
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    final String p = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(p, updateTime, updateDistance,
            this);
}

Ve onStatusChanged'i şu şekilde ele alıyorum:

void onStatusChanged(final String provider, final int status,
        final Bundle extras) {
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "No Service";
            location = null;
        }
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "no fix";
        }
        break;
    case LocationProvider.AVAILABLE:
        statusString = "fix";
        break;
    }
}

OnProvider {Dis, En} abled () yöntemlerinin, kullanıcı tarafından GPS izlemenin etkinleştirilmesi ve devre dışı bırakılmasıyla ilgili olduğunu unutmayın; aradığınız şey değil.


Ne yazık ki çoğu zaman işe yaramıyor. onLocationChanged () saniyede bir çağrılır, ancak onStatusChanged hiç çağrılmaz. Bazen keşke uzun bir süre veya hiç gelmeyecek bir bildirimi beklemek yerine mevcut durumu sorgulayabilseydim.
Edward Falk

2
Sağ. Önceki cevabımdan sonra birkaç şey öğrendim ve bunlardan biri, tüm Android platformlarının birbirine benzemediği. Hem HTC Hero'umda hem de Archos 5'imde onStatusChanged çağrılarını kesinlikle görüyorum, ancak her yerde çalışmamasına şaşırmadım. B planına ne dersiniz: Başka bir cevapta gösterilen GPSStatusListener'ı kullanırsınız ve uydulardan herhangi birinin usedInFix () için true dönüp dönmediğini görmeniz yeterlidir. Deneyimlerime göre standart GPS simgesinin davranışına en çok yaklaşan şey. (Bu standart simgeyi, BTW'yi uygulayan kaynağı bulmaya çalıştınız mı?)
CvR

0

Düzeltmeyi kontrol etmek için zaman aralığı ayarlamak iyi bir seçim değil .. hareket etmiyorsanız onLocationChanged'in çağrılmadığını fark ettim .. konum değişmediğinden anlaşılabilir olan :)

Daha iyi bir yol, örneğin:

  • son alınan konuma kadar olan aralığı kontrol edin (gpsStatusChanged olarak)
  • bu aralık 15 saniyeden fazlaysa, değişkeni ayarlayın: long_interval = true
  • konum dinleyiciyi kaldırın ve tekrar ekleyin, genellikle konum gerçekten mevcutsa güncellenmiş konum alırsınız, yoksa muhtemelen konumunuzu kaybettiniz
  • onLocationChanged'de long_interval değerini false olarak ayarladınız ..
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.