Johan
Johan

Reputation: 35194

Gps lat & long randomly displays very inaccurate results

Im listening to my phones GPS and post latitude and longitude to my webservice evey time onLocationChanged gets called. My problem is that in about 2% of my posts, it displays a VERY inaccurate result (several miles off). Should i check the accuracy from my location object before i post? Or do you have any other suggestions? Thanks!

public void onLocationChanged(Location location) {
    locationManager.removeUpdates(networkLocationListener);

    textView.setText(textView.getText().toString() + "New GPS location: "
            + String.format("%9.6f", location.getLatitude()) + ", "
            + String.format("%9.6f", location.getLongitude()) + "\n");

    //float accuracy = location.getAccuracy(); check this value?

    postLocationToWebservice(location);
}

Upvotes: 0

Views: 129

Answers (2)

Hemanshu
Hemanshu

Reputation: 76

It could be possible that the updated location is reported by NETWORK_PROVIDER instead of GPS_PROVIDER

you can always get the last updated GPS location by

     mLocationMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);

Upvotes: 0

Mukund Samant
Mukund Samant

Reputation: 1089

This is a very common problem while using the Location services of Android.There are few checks you can introduce to make sure that only the accurate location gets posted to you web service.

1.Compare the accuracy of all the location services.

2.Define a minimum limit for accuracy and a maximum limit for time.(Because some times the location obtained is accurate but it is an old one).

Check this code snippet and make necessary changes to accomplish what you want.Make sure you make a log build that checks the accuracy of your algorithm.

List<String> matchingProviders = myLocation.lm.getAllProviders();
    for (String provider: matchingProviders) 
    {
        Location location = myLocation.lm.getLastKnownLocation(provider);
        if (location != null) {
            float accuracy = location.getAccuracy();
            long time = location.getTime();

            if ((time > minTime && accuracy < bestAccuracy)) {
                bestResult = location;
                bestAccuracy = accuracy;
                bestTime = time;
            }
            else if (time < minTime && bestAccuracy == Float.MAX_VALUE && time > bestTime) {
                bestResult = location;
                bestTime = time;
            }
        }
    }

Upvotes: 1

Related Questions