Bagaimana cara memeriksa status penerima GPS saat ini?

90

Bagaimana cara memeriksa status penerima GPS saat ini? Saya sudah memeriksa LocationListener onStatusChangedmetode tetapi entah bagaimana tampaknya itu tidak berfungsi, atau hanya kemungkinan yang salah.

Pada dasarnya saya hanya perlu tahu apakah ikon GPS di bagian atas layar berkedip (tidak ada perbaikan sebenarnya) atau solid (perbaikan tersedia).

nr1
sumber

Jawaban:

150

Sebagai pengembang SpeedView: GPS speedometer untuk Android, saya pasti sudah mencoba setiap solusi yang mungkin untuk masalah ini, semua dengan hasil negatif yang sama. Mari tegaskan kembali apa yang tidak berhasil:

  1. onStatusChanged () tidak dipanggil di Eclair dan Froyo.
  2. Menghitung semua satelit yang tersedia tentu saja tidak berguna.
  3. Memeriksa apakah salah satu satelit mengembalikan true untuk usedInFix () juga tidak terlalu membantu. Sistem jelas kehilangan perbaikan tetapi terus melaporkan bahwa masih ada beberapa sat yang digunakan di dalamnya.

Jadi, inilah satu-satunya solusi yang saya temukan, dan yang benar-benar saya gunakan di aplikasi saya. Katakanlah kita memiliki kelas sederhana ini yang mengimplementasikan GpsStatus.Listener:

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;
        }
    }
}

Oke, sekarang di onLocationChanged () kami menambahkan yang berikut:

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

    mLastLocationMillis = SystemClock.elapsedRealtime();

    // Do something.

    mLastLocation = location;
}

Dan itu dia. Pada dasarnya, ini adalah baris yang melakukan semuanya:

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

Anda tentu saja dapat mengubah nilai milis, tetapi saya sarankan untuk menyetelnya sekitar 3-5 detik.

Ini benar-benar berfungsi dan meskipun saya belum melihat kode sumber yang menggambar ikon GPS asli, ini hampir mereplikasi perilakunya. Semoga ini bisa membantu seseorang.

soundmaven
sumber
Hai, saya bertanya-tanya mengapa menghitung satelit yang tersedia tidak berguna seperti dalam contoh ini? Jika jumlah satelit yang ditemukan 0 berarti tidak ada koneksi, atau saya salah? groups.google.com/group/android-developers/browse_thread/thread/…
per_jansson
3
Hai Stephen, dapatkah Anda menjelaskan mengapa isGPSFix berfungsi. Terima kasih, Nick
nickfox
Omong-omong, saya telah memperhatikan bahwa di ICS mereka menambah waktu sampai sistem mulai melaporkan bahwa pembacaan GPS telah hilang. Setidaknya di 4.0.3 tepatnya 10 detik.
soundmaven
Bekerja dengan baik, dan menggunakan 10 detik sebagai lawan 3-5 untuk ICS juga bekerja dengan cukup baik. Untungnya, memperbaiki bukanlah fitur yang diperlukan dari aplikasi saya, tetapi sebaiknya Anda dapat mengetahuinya. Terima kasih.
Tom
1
Tapi bukankah ini rusak ketika mLastLocationMillisdiatur oleh sumber selain GPS? Sistem akan mengklaim bahwa isGPSFixitu benar tetapi pada kenyataannya itu hanya perbaikan apa pun (mungkin satu dari jaringan telepon)
avalancha
25

Ikon GPS tampaknya mengubah statusnya sesuai dengan maksud siaran yang diterima. Anda dapat mengubah sendiri statusnya dengan contoh kode berikut:

Beri tahu bahwa GPS telah diaktifkan:

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

Beri tahu bahwa GPS menerima perbaikan:

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

Beri tahu bahwa GPS tidak lagi menerima perbaikan:

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

Beri tahu bahwa GPS telah dinonaktifkan:

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

Contoh kode untuk mendaftarkan penerima ke maksud:

// 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);

Dengan menerima maksud siaran ini, Anda dapat melihat perubahan dalam status GPS. Namun, Anda hanya akan diberi tahu saat keadaan berubah. Oleh karena itu, tidak mungkin untuk menentukan status saat ini menggunakan maksud ini.

sast
sumber
Saya tidak tahu bagaimana Anda dapat mengirim siaran itu dari aplikasi Anda karena tampaknya itu adalah siaran yang dilindungi sistem, artinya hanya sistem yang dapat mengirimnya. Aplikasi apa pun yang mengirimkan maksud tersebut seharusnya mogok.
JoxTraex
Itu mungkin untuk dikirim enam tahun yang lalu, ketika saya menulis jawabannya. Rupanya mereka telah menambahkan beberapa perlindungan ke sistem sejak itu.
sast
Saya menggunakan maksud ini untuk mengetahui kapan aplikasi lain menggunakan GPS. Saya percaya mulai dengan Nougat, Anda bahkan tidak dapat mendengarkan maksud ini lagi, itu atau mereka telah berubah! Saya tidak ingin mendengarkan lokasi dengan aplikasi saya sendiri. Ada yang punya ide lain?
Flyview
Ya, saya mengalami crash itu: 05-14 10: 25: 24.113 17344-17344 / xxx.yyy.zzz.debug E / AndroidRuntime: FATAL EXCEPTION: main Process: xxx.yyy.zzz.debug, PID: 17344 java. lang.SecurityException: Penolakan Izin: tidak diizinkan mengirim siaran android.location.GPS_FIX_CHANGE dari pid = 17344, uid = 10416
unlimited101
19

anggota baru jadi sayangnya saya tidak dapat berkomentar atau memilih, namun posting Stephen Daye di atas adalah solusi sempurna untuk masalah yang sama persis dengan yang saya sedang mencari bantuan.

perubahan kecil ke baris berikut:

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

untuk:

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

pada dasarnya karena saya sedang membangun game yang serba lambat dan interval pembaruan saya sudah diatur ke 5 detik, setelah sinyal gps keluar selama 10+ detik, itulah waktu yang tepat untuk memicu sesuatu.

cheers sobat, menghabiskan sekitar 10 jam mencoba menyelesaikan solusi ini sebelum saya menemukan posting Anda :)

chich
sumber
14

Oke, jadi mari kita coba kombinasi dari semua jawaban dan pembaruan sejauh ini dan lakukan sesuatu seperti ini:

Pendengar GPS bisa jadi seperti ini:

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 agak tidak jelas tentang kapan dan apa GPS dan informasi satelit yang diberikan, tapi saya pikir ide yang akan melihat berapa banyak satelit yang tersedia. Jika di bawah tiga, maka Anda tidak dapat memperbaikinya. Jika lebih, maka Anda harus memperbaikinya.

Trial and error mungkin adalah cara yang harus dilakukan untuk menentukan seberapa sering Android melaporkan info satelit, dan info apa yang GpsSatellitedikandung setiap objek.

Christopher Orr
sumber
Masalah dengan penghitungan satelit yang tersedia adalah, meskipun Anda memiliki 5 satelit dalam tampilan, ini tidak berarti bahwa selalu ada perbaikan. (Anda menyebutkannya dengan benar dengan menulis "Jika lebih banyak, maka Anda harus memperbaikinya")
nr1
Memang. Meskipun saya tidak tahu lagi tentang info apa yang diperlukan untuk membentuk perbaikan, atau bagaimana / apakah ini dapat diambil dari GpsSatelliteobjek.
Christopher Orr
Pemikiran lain .. Anda tidak menyebutkan ini dalam pertanyaan Anda, tetapi apakah Anda sudah mencoba hanya menggunakan LocationManager.requestLocationUpdatesdengan pengaturan waktu dan jarak yang disetel ke 0? Itu akan mengirimi Anda perbaikan GPS segera setelah terjadi. Jika Anda tidak menerima apa pun, kemungkinan besar Anda tidak memiliki perbaikan. Anda dapat menggabungkan ini dengan pendengar status di atas jika Anda mau.
Christopher Orr
1
Iterasi "sats" dan memeriksa usedInFix () di GpsSatellite mungkin?
DeliriumTremens
8

Setelah beberapa tahun bekerja dengan GPS di windows mobile, saya menyadari bahwa konsep "kehilangan" sinyal GPS bisa jadi subjektif. Untuk sekadar mendengarkan apa yang dikatakan GPS kepada Anda, menambahkan NMEAListener dan menguraikan kalimat akan memberi tahu Anda apakah perbaikan itu "valid" atau tidak. Lihat http://www.gpsinformation.org/dale/nmea.htm#GGA . Sayangnya dengan beberapa GPS, nilai ini akan berfluktuasi bolak-balik bahkan selama pengoperasian normal di area "perbaikan yang baik".

Jadi, solusi lainnya adalah membandingkan waktu UTC dari lokasi GPS dengan waktu telepon (dikonversi ke UTC). Jika jaraknya berbeda dengan perbedaan waktu tertentu, Anda dapat berasumsi bahwa Anda kehilangan posisi GPS.

Justin Breitfeller
sumber
Maukah Anda menjelaskan metode perbandingan waktu? Dalam jawaban Stephen Daye, dia membandingkan perbedaan waktu antara saat perbaikan terakhir terjadi dan peristiwa GPS_EVENT_SATELLITE_STATUS terbaru ... Tidak yakin apa yang diukurnya.
Rokey Ge
7

mengalami masalah serupa saat mengerjakan proyek MSc saya, tampaknya jawaban Daye secara keliru melaporkan "tidak ada perbaikan" sementara perangkat tetap berada di lokasi statis. Saya telah memodifikasi solusinya hanya sedikit yang tampaknya berfungsi dengan baik untuk saya di lokasi statis. Saya tidak tahu bagaimana pengaruhnya terhadap baterai karena ini bukan perhatian utama saya, tetapi inilah cara saya melakukannya dengan meminta kembali pembaruan lokasi ketika waktu perbaikan telah habis.

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;
        }
    }
}
Jeffery Lee
sumber
5

Nah, menyusun setiap pendekatan kerja akan menghasilkan ini (juga menangani deprecated 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) {

}

Catatan: jawaban ini adalah kombinasi dari jawaban di atas.

Gregory Stein
sumber
1
Selama Anda memberi kredit kepada penulis lain, tidak ada masalah untuk mendapatkan suara positif Anda sendiri untuk karya baru atau turunan. Aturan di sini lebih memperhatikan tentang orang yang menjiplak jawaban orang lain dan menggunakannya di tempat lain di Stack Overflow untuk menarik perwakilan secara tidak jujur. Karena Anda telah menyebutkan bahwa Anda telah membangun jawaban lain, saya pikir ini baik-baik saja.
halfer
3

Jika Anda hanya perlu tahu apakah ada perbaikan, periksa lokasi terakhir yang diketahui disediakan oleh penerima GPS dan periksa nilai .getTime () untuk mengetahui berapa usianya. Jika cukup baru-baru ini (seperti ... beberapa detik) Anda harus memperbaikinya.

   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(); 

... dan akhirnya bandingkan dengan waktu tanggal saat ini (Dalam UTC!). Jika cukup baru-baru ini, Anda harus memperbaikinya.

Saya melakukannya di aplikasi saya dan sejauh ini bagus.

Adan
sumber
+1 tampaknya layak untuk dicoba jika Anda langsung ingin tahu apakah ada perbaikan.
AgentKnopf
2

Saya mungkin salah tetapi tampaknya orang-orang tampaknya keluar dari topik

saya hanya perlu tahu apakah ikon gps di bagian atas layar berkedip (tidak ada perbaikan sebenarnya)

Itu mudah dilakukan

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

Untuk melihat apakah Anda memiliki perbaikan yang solid, semuanya menjadi sedikit lebih rumit:

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) {}
    };

Sekarang kapan pun Anda ingin melihat apakah Anda telah memperbaikinya?

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

Jika Anda ingin menjadi mewah, Anda selalu dapat memiliki waktu tunggu menggunakan System.currentTimeMillis () dan loc.getTime ()

Bekerja dengan andal, setidaknya pada N1 sejak 2.1.

regomodo
sumber
3
Solusi Anda terlalu rumit untuk apa yang dilakukannya. Namun itu sangat sedikit. Bagaimana jika setelah gps menentukan lokasi saya, saya pergi ke stasiun bawah tanah sehingga GPS kehilangan perbaikan?
berliku
1

Dengan LocationManager Anda bisa getLastKnownLocation () setelah Anda getBestProvider (). Ini memberi Anda objek Lokasi, yang memiliki metode getAccuracy () dalam meter dan getTime () dalam milidetik UTC

Apakah ini memberi Anda info yang cukup?

Atau mungkin Anda bisa mengulangi LocationProviders dan mencari tahu apakah masing-masing memenuhi Kriteria (ACCURACY_COARSE)

Mark Borgerding
sumber
1

begitu banyak postingan ...

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

menambahkan kode ini, dengan addGpsListener ... showMessageDialog ... hanya menampilkan jendela dialog standar dengan string

melakukan pekerjaan dengan sempurna untuk saya :) terima kasih banyak: =) (sry untuk posting ini, belum dapat memilih)

cV2
sumber
Ini baru perbaikan pertama. Bagaimana jika Anda memasuki terowongan?
Leos Literak
1

Jika Anda tidak memerlukan pembaruan segera setelah perbaikan hilang, Anda dapat memodifikasi solusi Stephen Daye dengan cara itu, bahwa Anda memiliki metode yang memeriksa apakah perbaikan masih ada.

Jadi Anda bisa memeriksanya kapan pun Anda membutuhkan beberapa data GPS dan dan Anda tidak memerlukan GpsStatus.Listener itu.

Variabel "global" adalah:

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

Ini adalah metode yang dipanggil dalam "onLocationChanged ()" untuk mengingat waktu pembaruan dan lokasi saat ini. Selain itu, update "isGpsFix":

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

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

        checkGpsFix(); // optional
    }

Metode itu dipanggil setiap kali saya perlu tahu apakah ada sinyal GPS:

private boolean checkGpsFix(){

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

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

Dalam implementasi saya, saya pertama kali menjalankan checkGpsFix () dan jika hasilnya benar saya menggunakan variabel "lastKnownLocation" sebagai posisi saya saat ini.

Sebastian Mauthofer
sumber
1

Saya tahu ini agak terlambat. Namun mengapa tidak menggunakan NMEAListener jika Anda ingin tahu apakah Anda memiliki perbaikan. Dari apa yang saya baca, NMEAListener akan memberi Anda kalimat NMEA dan dari sana Anda memilih kalimat yang benar.

Kalimat RMC berisi status perbaikan yaitu A untuk OK atau V untuk peringatan. Kalimat GGA berisi Fix Quality (0 invalid, 1 GPS or 2 DGPS)

Saya tidak dapat menawarkan kode java apa pun karena saya baru saja memulai dengan Android, tetapi saya telah membuat pustaka GPS di C # untuk aplikasi Windows, yang ingin saya gunakan dengan Xamarin. Saya hanya menemukan utas ini karena saya mencari informasi penyedia.

Dari apa yang telah saya baca sejauh ini tentang objek Lokasi, saya tidak begitu nyaman dengan metode seperti getAccuracy () dan hasAccuracy (). Saya terbiasa mengekstrak dari kalimat NMEA nilai HDOP dan VDOP untuk menentukan seberapa akurat perbaikan saya. Sangat umum untuk memperbaiki, tetapi memiliki HDOP yang buruk yang berarti akurasi horizontal Anda tidak terlalu bagus sama sekali. Misalnya duduk di meja Anda melakukan debug dengan perangkat GPS Bluetooth eksternal yang menempel di jendela, Anda kemungkinan besar akan mendapatkan perbaikan, tetapi HDOP dan VDOP yang sangat buruk. Tempatkan perangkat GPS Anda di pot bunga di luar atau sesuatu yang serupa atau tambahkan antena eksternal ke GPS dan segera Anda mendapatkan nilai HDOP dan VDOP yang baik.

pengguna2153142
sumber
0

Mungkin itu kemungkinan terbaik untuk membuat TimerTask yang menyetel Lokasi yang diterima ke nilai tertentu (null?) Secara teratur. Jika nilai baru diterima oleh GPSListener, itu akan memperbarui lokasi dengan data saat ini.

Saya pikir itu akan menjadi solusi yang berhasil.

nr1
sumber
0

Anda mengatakan bahwa Anda sudah mencoba onStatusChanged (), tetapi itu berhasil untuk saya.

Inilah metode yang saya gunakan (saya membiarkan kelas itu sendiri menangani onStatusChanged):

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);
}

Dan saya menangani onStatusChanged sebagai berikut:

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;
    }
}

Perhatikan bahwa metode onProvider {Dis, En} abled () adalah tentang mengaktifkan dan menonaktifkan pelacakan GPS oleh pengguna; bukan yang Anda cari.

CvR
sumber
Sayangnya, sering kali tidak berhasil. onLocationChanged () dipanggil sekali setiap detik, tetapi onStatusChanged tidak dipanggil sama sekali. Terkadang saya berharap saya bisa menanyakan status saat ini daripada menunggu pemberitahuan yang mungkin tidak datang untuk waktu yang lama, atau selamanya.
Edward Falk
2
Baik. Saya telah mempelajari beberapa hal sendiri setelah balasan sebelumnya, dan satu adalah bahwa tidak semua platform Android dibuat sama. Saya pasti melihat panggilan ke onStatusChanged di HTC Hero dan Archos 5 saya, tetapi saya tidak terkejut bahwa itu tidak berfungsi di semua tempat. Bagaimana dengan rencana B: Anda menggunakan GPSStatusListener yang ditampilkan dalam jawaban lain, dan cukup melihat apakah ada satelit yang mengembalikan true untuk usedInFix (). Dalam pengalaman saya, hal itu paling mendekati perilaku ikon GPS standar. (Sudahkah Anda mencoba menemukan sumber yang menerapkan ikon standar itu, BTW?)
CvR
0

Menyetel interval waktu untuk memeriksa perbaikan bukanlah pilihan yang baik .. saya perhatikan bahwa onLocationChanged tidak dipanggil jika Anda tidak bergerak .. apa yang bisa dimengerti karena lokasi tidak berubah :)

Cara yang lebih baik misalnya:

  • periksa interval ke lokasi terakhir yang diterima (di gpsStatusChanged)
  • jika interval itu lebih dari 15 detik, tetapkan variabel: long_interval = true
  • hapus pendengar lokasi dan tambahkan lagi, biasanya Anda mendapatkan posisi yang diperbarui jika lokasi benar-benar tersedia, jika tidak - Anda mungkin kehilangan lokasi
  • di onLocationChanged, Anda baru saja menyetel long_interval ke false ..
Kuat
sumber