Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why getSpeed() always return 0 on android

Tags:

I need to get the speed and heading from the gps. However the only number i have from location.getSpeed() is 0 or sometimes not available. my code:

        String provider = initLocManager();     if (provider == null)         return false;     LocationListener locListener = new LocationListener() {         public void onLocationChanged(Location location) {             updateWithNewLocation(location, interval, startId);             Log.i(getString(R.string.logging_tag), "speed =" + location.getSpeed());         }          public void onProviderDisabled(String provider){             updateWithNewLocation(null, interval, startId);         }          public void onProviderEnabled(String provider) {}         public void onStatusChanged(String provider, int status, Bundle extras) {}     };      _locManager.requestLocationUpdates(provider, interval,  DEFAULT_GPS_MIN_DISTANCE, locListener);       private String initLocManager() {     String context = Context.LOCATION_SERVICE;     _locManager = (LocationManager) getSystemService(context);      Criteria criteria = new Criteria();     criteria.setAccuracy(Criteria.ACCURACY_FINE);     criteria.setAltitudeRequired(false);     criteria.setBearingRequired(true);     criteria.setSpeedRequired(true);     criteria.setCostAllowed(true);     //criteria.setPowerRequirement(Criteria.POWER_LOW);     String provider = _locManager.getBestProvider(criteria, true);      if (provider == null || provider.equals("")) {         displayGPSNotEnabledWarning(this);         return null;     }      return provider; } 

I tried to play the Criteria with but no success. Does anyone have an idea what is the problem?

like image 755
user591539 Avatar asked Jan 27 '11 00:01

user591539


1 Answers

location.getSpeed() only returns what was set with location.setSpeed(). This is a value that you can set for a location object.

To calculate the speed using GPS, you'll have to do a little math:

Speed = distance / time 

So you would need to do:

(currentGPSPoint - lastGPSPoint) / (time between GPS points) 

All converted to ft/sec, or however you want to show the speed. This is how I did it when I made a runner app.

More specifically, you'll need to calculate for absolute distances:

(sqrt((currentGPSPointX - lastGPSPointX)^2) + (currentGPSPointY - lastGPSPointY)^2)) / (time between GPS points) 

It might help to make a new TrackPoint class or something, which keeps the GPS location and time it was taken inside.

like image 110
John Leehey Avatar answered Nov 02 '22 22:11

John Leehey