Search code examples
androidgpslocationdetectsatellite

Getting "satellites in view", and "satellites in use" counts in Android


I am having an unusually difficult time getting correct "satellites in use" and "satellites in view" integers from my GPS implementation. I have reviewed numerous relevant Stackoverflow threads with no immediate enlightenment. Below is what I have so far that "should" work, however it does not. I've rebuilt this several times from different perspectives without getting either the number of satellites in use or satellites in view. Thanks in advance...

public class GpsData extends Service implements LocationListener {
private GpsStatus mGpsStatus;
private final Context mContext;
boolean isGPSEnabled = false; // flag for GPS status
boolean isNetworkEnabled = false; // flag for network status
boolean canGetLocation = false; // flag for GPS status
Location location; // location
double dLatitude, dAltitude, dLongitude, dAccuracy, dSpeed, dSats; 
float fAccuracy, fSpeed;
long lSatTime;     // satellite time
String szSignalSource, szAltitude, szAccuracy, szSpeed;
public String szSatellitesInView; 
public String szSatellitesInUse;
public static String szSatTime;
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 0 meters
private static final long MIN_TIME_BW_UPDATES = 1000; //1 sec
protected LocationManager locationManager;
protected GpsListener gpsListener = new GpsListener();

public GpsData(Context context) {
    this.mContext = context;
    getLocation();
    locationManager.addGpsStatusListener(gpsListener);  
}
class GpsListener implements GpsStatus.Listener{
    @Override
    public void onGpsStatusChanged(int event) {
        int iCountInView = 0;
        int iCountInUse = 0;            
        mGpsStatus = locationManager.getGpsStatus(mGpsStatus);          
        Iterable<GpsSatellite> satellites = mGpsStatus.getSatellites(); 
        if (satellites != null) {
            for (GpsSatellite gpsSatellite : satellites) {
                iCountInView++;
                if (gpsSatellite.usedInFix()) {
                    iCountInUse++;
                }
            }
        }
         {
             {
            szSatellitesInView = String.valueOf(iCountInView);          
            szSatellitesInUse = String.valueOf(iCountInUse);  
    }
    }   
public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
        // getting GPS satellite status
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        // getting cellular network status
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationManager.addGpsStatusListener(gpsListener);//needed?
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Cell tower", "Cell tower");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        dLatitude = location.getLatitude();
                        dLongitude = location.getLongitude();
                        lSatTime = location.getTime();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.addGpsStatusListener(gpsListener);
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            dLatitude = location.getLatitude();
                            dLongitude = location.getLongitude();
                            lSatTime = location.getTime();  
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return location;
}

Solution

  • Got it.

    public class GpsData extends Service implements LocationListener {
    
    boolean isGPSEnabled = false; // flag for GPS satellite status
    boolean isNetworkEnabled = false; // flag for cellular network status
    boolean canGetLocation = false; // flag for either cellular or satellite status
    
    private GpsStatus mGpsStatus;
    private final Context mContext;
    protected LocationManager locationManager;
    protected GpsListener gpsListener = new GpsListener();
    
    Location location; // location
    double dLatitude, dAltitude, dLongitude, dAccuracy, dSpeed, dSats; 
    float fAccuracy, fSpeed;
    long lSatTime;     // satellite time
    String szSignalSource, szAltitude, szAccuracy, szSpeed;
    
    public String szSatellitesInUse, szSatellitesInView;
    public static String szSatTime;
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 0 meters
    private static final long MIN_TIME_BW_UPDATES = 1000; //1 second
    
    public GpsData(Context context) {
        this.mContext = context;
        getLocation();  
    }
    class GpsListener implements GpsStatus.Listener{
        @Override
        public void onGpsStatusChanged(int event) {
        }
    }   
    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);// getting GPS satellite status
            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);// getting cellular network status
            if (!isGPSEnabled && !isNetworkEnabled) {
            } else {
                this.canGetLocation = true;
                if (isNetworkEnabled) {//GPS is enabled, getting lat/long via cellular towers
                    locationManager.addGpsStatusListener(gpsListener);//inserted new
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Cell tower", "Cell tower");
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            szAltitude = " NA (using cell towers)";
                            szSatellitesInView = " NA (using cell towers)";
                            szSatellitesInUse = " NA (using cell towers)";          
                        }
                    }
                }
                if (isGPSEnabled) {//GPS is enabled, gettoing lat/long via satellite
                    if (location == null) {
                        locationManager.addGpsStatusListener(gpsListener);//inserted new
                        locationManager.getGpsStatus(null);
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) { 
                                dAltitude = location.getAltitude();
                                szAltitude = String.valueOf(dAltitude);
                                /**************************************************************
                                 * Provides a count of satellites in view, and satellites in use
                                 **************************************************************/
                                mGpsStatus = locationManager.getGpsStatus(mGpsStatus);          
                                Iterable<GpsSatellite> satellites = mGpsStatus.getSatellites();
                                int iTempCountInView = 0;
                                int iTempCountInUse = 0;
                                if (satellites != null) {
                                    for (GpsSatellite gpsSatellite : satellites) {
                                        iTempCountInView++;
                                        if (gpsSatellite.usedInFix()) {
                                            iTempCountInUse++;
                                        }
                                    }       
                                }   
                                szSatellitesInView = String.valueOf(iTempCountInView);
                                szSatellitesInUse = String.valueOf(iTempCountInUse);
                            }
                        }
                    }
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
        return location;
    }