GpsStatus.GPS_EVENT_FIRST_FIX is often time consuming

I have an Android device installed inside a car. I need to get gps location updates every second. my problem is that I am getting all the data I need (number of satellites, coordinates, time, etc.)

but for some reason "GpsStatus.GPS_EVENT_FIRST_FIX" is not called or, if called, it takes a long time (eg 30 minutes ..)

why? here is my code:

    public class ExtProtocolService extends Service implements GpsStatus.Listener {

        private GpsStatus gpsStatus;
        private GpsData gpsData;
        private LocationManager locationManager;
        private LocationListener locationListener;

@Override
public void onCreate() {


            locationManager = (LocationManager)      

            getSystemService(this.LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            String provider = locationManager.getBestProvider(criteria, true);
            if(provider.equals("gps"))
            {
                locationListener = new LocationListener() {

                    @Override
                    public void onStatusChanged(String provider, int status,
                            Bundle extras) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onProviderEnabled(String provider) {
                        // TODO Auto-generated method stub
                        // not used

                    }

                    @Override
                    // not used
                    public void onProviderDisabled(String provider) {
                        // TODO Auto-generated method stub

                    }

                    // update location parameters when location is changed
                    @Override
                    public void onLocationChanged(Location location) {
                        gpsData.setLatitude(location.getLatitude());
                        L.m("LATLONG", "latitude " + location.getLatitude());
                        gpsData.setLongitude(location.getLongitude());
                        L.m("LATLONG", "longitude " + location.getLongitude());
                        gpsData.setSpeed(location.getSpeed());
                        gpsData.setHeading(location.getBearing());
                        gpsData.setAltitude(location.getAltitude());
                        gpsData.setHdop(location.getAccuracy());

                    }
                };
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        1000, 0, locationListener); // update location every 1000 ms
                locationManager.addGpsStatusListener(this);


            }
    }

        @Override
        public void onGpsStatusChanged(int event) {
            switch (event) {
            case GpsStatus.GPS_EVENT_FIRST_FIX:
                gpsData.setLocked(true); // gps is locked
                break;
            case GpsStatus.GPS_EVENT_STOPPED:
                gpsData.setLocked(false); // gps unreachable
                break;
            }

            gpsStatus = locationManager.getGpsStatus(null);

            // calc number of satelites fixed
            Iterable<GpsSatellite> sats = gpsStatus.getSatellites();
            int satellites = 0;
            int satellitesInFix = 0;
            int timetofix = gpsStatus.getTimeToFirstFix();
            for (GpsSatellite sat : sats) {
                if (sat.usedInFix()) {
                    satellitesInFix++;
                }
                satellites++;
            }

            gpsData.setNumSatellites(satellitesInFix);
            L.m("GPS", gpsData.toString());

        }


    }

      

edit: also i cant use google location API.

+3


source to share





All Articles