Tengo un código de Android que necesita obtener la mejor ubicación disponible RÁPIDAMENTE, desde el GPS, la red o lo que esté disponible. La precisión es menos importante que la velocidad.Android: obtenga la ubicación actual del mejor proveedor disponible
Obtener la mejor ubicación disponible es seguramente una tarea realmente estándar. Sin embargo, no puedo encontrar ningún código para demostrarlo. El código de ubicación de Android espera que especifique criterios, se registre para las actualizaciones y espere, lo cual está bien si tiene criterios detallados y no le importa esperar.
Pero mi aplicación necesita funcionar un poco más como la aplicación de Mapas cuando lo localiza por primera vez, trabaja desde cualquier proveedor disponible, y simplemente comprueba que la ubicación no está muy desactualizada o es nula.
He intentado rodar mi propio código para hacer esto, pero estoy teniendo problemas. (Está dentro de un servicio de intención donde ocurre una carga, si eso hace alguna diferencia. He incluido todo el código para obtener información.) ¿Qué pasa con este código?
@Override
protected void onHandleIntent(Intent arg0) {
testProviders();
doUpload();
}
private boolean doUpload() {
int j = 0;
// check if we have accurate location data yet - wait up to 30 seconds
while (j < 30) {
if ((latString == "") || (lonString == "")) {
Log.d(LOG_TAG, "latlng null");
Thread.sleep(1000);
j++;
} else {
Log.d(LOG_TAG, "found lat " + latString + " and lon " + lonString);
break;
}
//do the upload here anyway, with or without location data
//[code removed for brevity]
}
public boolean testProviders() {
Log.e(LOG_TAG, "testProviders");
String location_context = Context.LOCATION_SERVICE;
locationmanager = (LocationManager) getSystemService(location_context);
List<String> providers = locationmanager.getProviders(true);
for (String provider : providers) {
Log.e(LOG_TAG, "registering provider " + provider);
listener = new LocationListener() {
public void onLocationChanged(Location location) {
// keep checking the location - until we have
// what we need
//if (!checkLoc(location)) {
Log.e(LOG_TAG, "onLocationChanged");
locationDetermined = checkLoc(location);
//}
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
};
locationmanager.requestLocationUpdates(provider, 0,
0, listener);
}
Log.e(LOG_TAG, "getting updates");
return true;
}
private boolean checkLoc(Location location) {
float tempAccuracy = location.getAccuracy();
int locAccuracy = (int) tempAccuracy;
Log.d(LOG_TAG, "locAccuracy = " + locAccuracy);
if ((locAccuracy != 0) && (locAccuracy < LOCATION_ACCURACY)) {
latitude = location.getLatitude();
longitude = location.getLongitude();
latString = latitude.toString();
lonString = longitude.toString();
return true;
}
return false;
}
public void removeListeners() {
// Log.e(LOG_TAG, "removeListeners");
if ((locationmanager != null) && (listener != null)) {
locationmanager.removeUpdates(listener);
}
locationmanager = null;
// Log.d(LOG_TAG, "Removed " + listener.toString());
}
@Override
public void onDestroy() {
super.onDestroy();
removeListeners();
}
Por desgracia, este se encuentra el proveedor de red, pero sólo alguna vez da salida a latlng null
30 veces - nunca parece conseguir un lugar en absoluto. Ni siquiera recibo una declaración de registro de locationChanged
.
Es curioso, porque a partir de DDMS puedo ver una salida como:
NetworkLocationProvider: onCellLocationChanged [305,8580]
NetworkLocationProvider: getNetworkLocation(): returning cache location with accuracy 75.0
parecía sugerir que el proveedor de red tiene cierta información de ubicación después de todo, no estoy recibiendo en ella.
¿Alguien puede ayudar? Creo que el código de ejemplo de trabajo sería un recurso útil para la comunidad de Android/StackOverflow.
Tal vez mi ejemplo de código puede ayudar http://stackoverflow.com/ preguntas/3145089/qué-es-la-más-simple-y-más-robusta-manera-de-obtener-los-usuarios-actual-ubicación-en-una/3145655 # 3145655 – Fedor