Recuperación de # de satélites utilizados en la reparación de gps de Android

Estoy tratando de recuperar el # de satélites utilizados en el arreglo GPS. He implementado dos métodos diferentes, como se muestra a continuación:

package ti.utils; import android.app.Activity; import android.content.Context; import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; public class Gps { private static final int TWO_MINUTES = 1000 * 60 * 2; private static Location Location; public static int Satellites = -1; public static void StartTracking(Activity activity) { final LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); //listen for gps status changes. GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { Log("In onGpsStatusChanged event: " + event); if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS || event == GpsStatus.GPS_EVENT_FIRST_FIX) { GpsStatus status = locationManager.getGpsStatus(null); Iterable<GpsSatellite> sats = status.getSatellites(); // Check number of satellites in list to determine fix state Satellites = 0; for (GpsSatellite sat : sats) { //if(sat.usedInFix()) Satellites++; } Log("Setting Satellites from GpsStatusListener: " + Satellites); } } }; locationManager.addGpsStatusListener(gpsStatusListener); //listen for location changes. LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { // Called when a new location is found by the network location provider. try { Log("Location changed! Speed = " + location.getSpeed() + " & Satellites = " + location.getExtras().getInt("satellites")); boolean isBetter = isBetterLocation(location, Location); if(isBetter) { Log("Set to new location"); Location = location; Satellites = location.getExtras().getInt("satellites"); Log("Setting Satellites from LocationListener: " + Satellites); } } catch(Exception exc) { Log(exc.getMessage()); } } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); } /** Determines whether one Location reading is better than the current Location fix * @param location The new Location that you want to evaluate * @param currentBestLocation The current Location fix, to which you want to compare the new one */ protected static boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { // A new location is always better than no location return true; } // Check whether the new location fix is newer or older long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; // If it's been more than two minutes since the current location, use the new location // because the user has likely moved if (isSignificantlyNewer) { return true; // If the new location is more than two minutes older, it must be worse } else if (isSignificantlyOlder) { return false; } // Check whether the new location fix is more or less accurate int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; // Check if the old and new location are from the same provider boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); // Determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } /** Checks whether two providers are the same */ private static boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); } private static void Log(String message) { if(message != null && message.length() > 0) { //android.util.Log.i(LCAT, message); org.appcelerator.kroll.common.Log.i("SygicModule", message); } } } 

Ninguno de los eventos del oyente (onGpsStatusChanged & onLocationChanged) nunca dispara, aunque tengo el GPS autónomo activado en mi teléfono. Tengo el conjunto de permisos ACCESS_FINE_LOCATION:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

Descargé una aplicación de terceros llamada GPS Estado y fue capaz de mostrar correctamente el número de satélites, así que sé que no es un problema con mi Droid X2.

¿Algunas ideas?

 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

Debiera ser

 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

Aquí está el código que terminó trabajando.

 package ti.utils; import android.app.Activity; import android.content.Context; import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; public class Gps { private static final int TWO_MINUTES = 1000 * 60 * 2; private static Location Location; public static int Satellites = -1; public static void StartTracking(Activity activity) { final LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); //listen for gps status changes. GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() { @Override public void onGpsStatusChanged(int event) { Log("In onGpsStatusChanged event: " + event); if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS || event == GpsStatus.GPS_EVENT_FIRST_FIX) { GpsStatus status = locationManager.getGpsStatus(null); Iterable<GpsSatellite> sats = status.getSatellites(); // Check number of satellites in list to determine fix state Satellites = 0; for (GpsSatellite sat : sats) { //if(sat.usedInFix()) Satellites++; } Log("Setting Satellites from GpsStatusListener: " + Satellites); } } }; locationManager.addGpsStatusListener(gpsStatusListener); //listen for location changes. LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // Called when a new location is found by the network location provider. /*try { Log("Location changed! Speed = " + location.getSpeed() + " & Satellites = " + location.getExtras().getInt("satellites")); boolean isBetter = isBetterLocation(location, Location); if(isBetter) { Log("Set to new location"); Location = location; Satellites = location.getExtras().getInt("satellites"); Log("Setting Satellites from LocationListener: " + Satellites); } } catch(Exception exc) { Log(exc.getMessage()); }*/ } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } /** Determines whether one Location reading is better than the current Location fix * @param location The new Location that you want to evaluate * @param currentBestLocation The current Location fix, to which you want to compare the new one */ protected static boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { // A new location is always better than no location return true; } // Check whether the new location fix is newer or older long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; // If it's been more than two minutes since the current location, use the new location // because the user has likely moved if (isSignificantlyNewer) { return true; // If the new location is more than two minutes older, it must be worse } else if (isSignificantlyOlder) { return false; } // Check whether the new location fix is more or less accurate int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; // Check if the old and new location are from the same provider boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); // Determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } /** Checks whether two providers are the same */ private static boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); } private static void Log(String message) { if(message != null && message.length() > 0) { //android.util.Log.i(LCAT, message); org.appcelerator.kroll.common.Log.i("UtilsModule", message); } } } 

Si no puede obtener el número de satélites a través de GPS_EVENT_SATELLITE_STATUS entonces podría tener su implementación de la actividad NmeaListener .

Si implementa el NmeaListener entonces tendrá que analizar la cadena de mensajes recibida en onNmeaReceived para extraer el número de satélites. Los formatos NMEA se describen aquí . Entonces usted puede ser que tenga gusto de hacer una búsqueda de Google para "Java" + "NMEA parser"

Lo conseguí trabajando teniendo el código siguiente. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationUpdateHandler()); int nSatellites = location.getExtras().getInt("satellites", -1);

nSatellites se encontró que era> 0 una vez que comencé a obtener corrección ( onLocationChanged callbacks).

  • Se pierde el proveedor de Android Fused Location
  • Diferencia entre AsyncTask y Thread / Runnable
  • ¿Cómo comprobar la presencia de un sensor GPS?
  • Actualizaciones de ubicación de fondo android y wakelock
  • ¿Cómo puedo obtener la ubicación GPS actual?
  • Localización en tiempo real del dispositivo android desde otro dispositivo
  • A-GPS, restablecimiento de GPS y sendExtraCommand
  • Navegador Android intención: abrir la aplicación de navegación con coordenadas GPS
  • El tiempo GPS de Android es 15 segundos más rápido
  • Android Habilitar y deshabilitar GPS
  • Android GPS obtener la ubicación actual
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.