Getting the number of satellites from Location object
Asked Answered
W

4

7

I'm using a GPS provider and LocationListener.onLocationChanged(Location location) to receive location fixes.
Documentation says, that Location.getExtras() contains next key/value pair:

satellites - the number of satellites used to derive the fix

but on practice I'm getting an empty extra object - there is no any data there.
Does it means that I'm getting the A-GPS fixes and not GPS?

Welty answered 5/7, 2011 at 9:36 Comment(0)
D
21

To get the number of satellites used by the GPS engine you need to implement android.location.GpsStatus.Listener and implement its method onGpsStatusChanged().

Example...

public void onGpsStatusChanged(int event) {
    int satellites = 0;
    int satellitesInFix = 0;
    int timetofix = locationManager.getGpsStatus(null).getTimeToFirstFix();
    Log.i(TAG, "Time to first fix = " + timetofix);
    for (GpsSatellite sat : locationManager.getGpsStatus(null).getSatellites()) {
        if(sat.usedInFix()) {
            satellitesInFix++;              
        }
        satellites++;
    }
    Log.i(TAG, satellites + " Used In Last Fix ("+satellitesInFix+")"); 
}
Downe answered 28/9, 2012 at 11:58 Comment(2)
I don't understand why I need to implement a listener if I want to poll for the number of satellites... yet trying to call getSatellites() without setting up a listener always returns no satellites, even when a GPS has a fix and is locked.Endospore
It's very important to add the listener to the location manager like locationManager.addGpsStatusListener(<whatever implemented GpsStatus.Listener>); or else the listener won't be called.Sexuality
H
14

I use Location.getExtras().getInt("satellites"), and it give the number of satellites in use.

Houk answered 13/11, 2013 at 15:9 Comment(0)
U
6

Since Android API 24 GpsStatus is deprecated and one should use GnssStatus. Let us have an activity or a service processing Gps data and a LocationManager already created.

private GnssStatus.Callback gnssCallback;

public void initCallbacks() {
    ....
    gnssCallback = new GnssStatus.Callback() {
        @Override
        public void onSatelliteStatusChanged(@NonNull GnssStatus status) {
            final int satelliteCount = status.getSatelliteCount();
            int usedCount = 0;
            for (int i = 0; i < satelliteCount; ++i)
                if (status.usedInFix(i))
                    ++usedCount;
            Log.d("MyServiceTag", "satellites count = " + satelliteCount + ", used = " + usedCount);
        }
    };
    locationManager.registerGnssStatusCallback(gnssCallback, new Handler(Looper.myLooper()));
    ....
}

public void deinitCallbacks() {
    ....
    locationManager.unregisterGnssStatusCallback(gnssCallback);
    ....
}

initCallbacks() should be called after locationManager initialization. deinitCallbacks() should be called when information on the number of satellites is no longer needed, e.g. in onDestroy(). GnssStatus.getSatelliteCount() returns total number of known satellites, GnssStatus.usedInFix(int i) tells whether i-th satellite had been used in the most actual location capture.

Unsubstantial answered 21/7, 2022 at 7:5 Comment(0)
T
1

Nope it means that your phone manufacturer decided not to implement this. (Or you could be using the NETWORK_PROVIDER which does not use satellites)

Use a NmeaListener and parse the sentences to know the number of satellites visible or used.

Toucan answered 5/7, 2011 at 9:48 Comment(3)
I'm definitely using GPS_PROVIDER. There is a chance that Samsung din't implemented this in Nexus S?Welty
You should be able to get it using [bundle.getInt("satellites")](developer.android.com/reference/android/os/…. Are you sure you're getting fixes? Use the Nmea listener and look at the GPGSV sentencesToucan
You right, Location.getExtras().getInt("satellites") suppose to return the number of satellites. But its not - I'm always getting a zero there despite the fact that location object itself contains a valid coordinatesWelty

© 2022 - 2024 — McMap. All rights reserved.