Datos de ubicación incorrecta de Android GPS en la consulta

No estoy usando localizaciones falsas para esto … De hecho el código estaba trabajando muy bien la semana pasada.

Tengo una aplicación que reúne datos de GPS y escupe un enlace de mapas de Google utilizando coordenadas X, Y generadas por la aplicación en sí. No estoy 100% seguro de por qué no funciona de la manera que debe ser, pero cuando solicito la aplicación para hacer un vínculo de mapas de google basado en la ubicación GPS proporcionado por el teléfono me dice que estoy 5-6 bloques de distancia de mi punto de Origen (Donde realmente estoy en el momento) No es exactamente lo que quiero que haga

Conocidos

  • Tengo los permisos adecuados establecidos
  • Todo el código funcionó la semana pasada muy bien

Aquí está el código para recopilar la información del GPS:

Toast.makeText(context, "Gathering GPS Data...", Toast.LENGTH_SHORT).show(); gps = new gpsTracker(Settings.this); if(gps.canGetLocation()){ try{ gps.getLocation(); lon = gps.getLongitude(); lat = gps.getLatitude(); Toast.makeText(getApplicationContext(), "Your location is - \nlat: " + lat + "\nlon: " + lon, Toast.LENGTH_LONG).show(); } catch(Exception e){} } else{ gps.showSettingsAlert(); } 

La clase de todo lo anterior está tirando desde:

 import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.util.Log; public class gpsTracker extends Service implements LocationListener { private final Context mContext; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location; // location double latitude; // latitude double longitude; // longitude // The minimum distance to change Updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; public gpsTracker(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; // First get location from Network Provider if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } /** * Stop using GPS listener * Calling this function will stop using GPS in your app * */ public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(gpsTracker.this); } } /** * Function to get latitude * */ public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } /** * Function to get longitude * */ public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } /** * Function to check GPS/wifi enabled * @return boolean * */ public boolean canGetLocation() { return this.canGetLocation; } /** * Function to show settings alert dialog * On pressing Settings button will lauch Settings Options * */ public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); // Setting Dialog Title alertDialog.setTitle("GPS is settings"); // Setting Dialog Message alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); // On pressing Settings button alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // on pressing cancel button alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // Showing Alert Message alertDialog.show(); } @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } 

2 Solutions collect form web for “Datos de ubicación incorrecta de Android GPS en la consulta”

De lo que se especifica [diferencia de 4-5 bloques], puede obtener la location de networkProvider solamente.

Con este código de gpsTracker mencionado en la pregunta,
Hay algunas modificaciones necesarias, en lugar de utilizar el código tal como está:

1. Hay 2 bucles if que verifican que la fuente de la location está habilitada o no y No ' else ':

  if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } 

Esto significa que la aplicación va a hacer dos veces el trabajo cuando se puede obtener la location de ambas fuentes. Además, la fuente de location obtenida siempre sigue siendo ambigua.

Esto es bueno cuando sólo necesita una location aproximada que no debe ser nula majorly.

Si desea utilizar sólo esta clase para obtener la location , intente estructurar el if-else según el requisito y asegurarse de que no va a repetirse si se obtiene la location .
P.ej. Si el GPS está en una preferencia más alta, se aplica en su caso, el cambio que if arriba y poner la condición de la red con un else como:

 if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } else if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } 

Para su requisito, sugiero la eliminación de la parte del proveedor de red y la obtención de la location sólo desde el GPS, especialmente si la línea de visión no es un problema.

Cuando el código funcionaba correctamente, debe buscar la ubicación desde el GPS y configurarlo en el objeto. Pero debido a los dos " if " y no " else ", nunca sabrás si la location obtenida es de red o GPS – puedes comprobar location.getProvider () dentro de la condición de canGetLocation()

2. También, usted puede registrar el mensaje o pedir una cierta acción para una fuente particular … como:
En esta parte:

  if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } 

Sólo separar en dos diferentes if (s) y código en consecuencia. A partir de ahora, no pasa nada aquí por lo que no sabría si ambos están desactivados a menos que lo compruebe externamente.

Sugerencia: Pruebe el LocationClient que utiliza GooglePlayServices para recuperar la ubicación actual . Lo he encontrado más confiable y útil. Compruebe este ejemplo de proveedor de ubicación fusionado , estableciendo el objeto LocationRequest según su requisito es la clave.

Otra actualización: acaba de encontrar: preguntas útiles sobre desbordamiento de pila – Buena forma de obtener la ubicación de los usuarios


Actualización para cualquiera que busque esta pregunta / respuesta
Respecto a la sugerencia de LocationClient;
LocationClient ya no se encuentra en com.google.android.gms.location , consulte:
Android play services 6.5: LocationClient falta

Usted debe visitar http://developer.android.com/guide/topics/location/strategies.html . Hay algunas buenas estrategias para obtener ubicaciones precisas en esta página. He aquí un ejemplo de código que he tomado del sitio:

 private static final int TWO_MINUTES = 1000 * 60 * 2; /** 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 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 boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); } 
  • Cómo prevenir "Programar el reinicio del servicio bloqueado"?
  • Error: Incapaz de fnd clase R.java No hay tal archivo o directorio
  • Envío de mayúsculas a un TextEdit durante pruebas instrumentadas
  • Cuando se utiliza GLES20.glReadPixels en android, los datos devueltos por él no son exactamente iguales con la vista previa en vivo
  • ¿Cómo conectar un socket SSL a través de un proxy HTTP?
  • ¿Cómo evitar la copia de seguridad automática de una aplicación de Android?
  • El paquete no existe cuando se utiliza una aplicación independiente como dependencia
  • Conexión WiFi a través de Android
  • Acceda al objeto JNI a la capa de Java como puntero de referencia
  • Cómo obtener una respuesta JSON grande en Android Sybase Unwired Platform
  • Android Bitmap.createBitmap () rellena montón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.