From 19ac2c440868418e4a7cda96d7a6fdc5b786cb8f Mon Sep 17 00:00:00 2001 From: martin-s Date: Tue, 14 Dec 2010 08:35:44 +0000 Subject: [PATCH] Add:Android:Add fast provider until slow provider is ready, fix from #670|Thanks tgc git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@3783 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- .../src/org/navitproject/navit/NavitVehicle.java | 66 ++++++++++++++++++---- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/navit/navit/android/src/org/navitproject/navit/NavitVehicle.java b/navit/navit/android/src/org/navitproject/navit/NavitVehicle.java index 9f56549..754a8d1 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitVehicle.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitVehicle.java @@ -31,34 +31,76 @@ import android.location.*; public class NavitVehicle { private LocationManager locationManager; private int vehicle_callbackid; + private String preciseProvider; + private String fastProvider; public native void VehicleCallback(int id, Location location); NavitVehicle (Context context, int callbackid) { locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); - Criteria criteria = new Criteria(); - criteria.setAccuracy(Criteria.ACCURACY_FINE); - criteria.setAltitudeRequired(true); - criteria.setBearingRequired(true); - criteria.setCostAllowed(true); - criteria.setPowerRequirement(Criteria.POWER_HIGH); + /* Use 2 LocationProviders, one precise (usually GPS), and one + not so precise, but possible faster. The fast provider is + disabled when the precise provider gets its first fix. */ + + // Selection criterias for the precise provider + Criteria highCriteria = new Criteria(); + highCriteria.setAccuracy(Criteria.ACCURACY_FINE); + highCriteria.setAltitudeRequired(true); + highCriteria.setBearingRequired(true); + highCriteria.setCostAllowed(true); + highCriteria.setPowerRequirement(Criteria.POWER_HIGH); + // Selection criterias for the fast provider + Criteria lowCriteria = new Criteria(); + lowCriteria.setAccuracy(Criteria.ACCURACY_COARSE); + lowCriteria.setAltitudeRequired(false); + lowCriteria.setBearingRequired(false); + lowCriteria.setCostAllowed(true); + lowCriteria.setPowerRequirement(Criteria.POWER_HIGH); Log.e("NavitVehicle", "Providers "+locationManager.getAllProviders()); - String provider = locationManager.getBestProvider(criteria, false); - Log.e("NavitVehicle", "Provider "+provider); - Location location = locationManager.getLastKnownLocation(provider); + + preciseProvider = locationManager.getBestProvider(highCriteria, false); + Log.e("NavitVehicle", "Precise Provider " + preciseProvider); + fastProvider = locationManager.getBestProvider(lowCriteria, false); + Log.e("NavitVehicle", "Fast Provider " + fastProvider); vehicle_callbackid=callbackid; - locationManager.requestLocationUpdates(provider, 0, 0, locationListener); + + locationManager.requestLocationUpdates(preciseProvider, 0, 0, preciseLocationListener); + + // If the 2 providers is the same, only activate one listener + if (fastProvider == null || preciseProvider.compareTo(fastProvider) == 0) { + fastProvider = null; + } else { + locationManager.requestLocationUpdates(fastProvider, 0, 0, fastLocationListener); + } } - private final LocationListener locationListener = new LocationListener() { + private final LocationListener preciseLocationListener = new LocationListener() { + public void onLocationChanged(Location location) { + + // Disable the fast provider if still active + if (fastProvider != null) { + locationManager.removeUpdates(fastLocationListener); + fastProvider = null; + } + + // Log.e("NavitVehicle", "LocationChanged Accuracy " + location.getAccuracy() + " Altitude " + location.getAltitude() + " Bearing " + location.getBearing() + " Speed " + location.getSpeed() + " Latitude " + location.getLatitude() + " Longitude " + location.getLongitude()); + VehicleCallback(vehicle_callbackid, location); + } + public void onProviderDisabled(String provider){} + public void onProviderEnabled(String provider) {} + public void onStatusChanged(String provider, int status, Bundle extras) {} + }; + + private final LocationListener fastLocationListener = new LocationListener() { public void onLocationChanged(Location location) { // Log.e("NavitVehicle", "LocationChanged Accuracy " + location.getAccuracy() + " Altitude " + location.getAltitude() + " Bearing " + location.getBearing() + " Speed " + location.getSpeed() + " Latitude " + location.getLatitude() + " Longitude " + location.getLongitude()); - VehicleCallback(vehicle_callbackid, location); + VehicleCallback(vehicle_callbackid, location); } public void onProviderDisabled(String provider){} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; + } -- 2.7.4