Estoy escribiendo una aplicación que requiere la ubicación actual del usuario (lastknownlocation no será muy útil) y muestra una lista de todos los "elementos" más cercanos a ellos tomados de la base de datos.Android Buscar ubicación GPS una vez, mostrar cuadro de diálogo de carga
He encontrado que los artículos más cercanos funcionan bien pero solo usando una ubicación de latitud y longitud codificada por el momento, pero ahora es el momento de implementar la búsqueda de la ubicación real.
¿Alguien puede dar un ejemplo de cómo hacer que la aplicación encuentre la ubicación correcta actual en segundo plano y que la aplicación espere? Solo necesito la ubicación una vez que no se actualiza a medida que la persona se mueve. Implementé un oyente de ubicación, sin embargo, entiendo que la corrección de un GPS puede ser lenta. He visto otros ejemplos utilizando la última ubicación conocida o implementando el receptor de la ubicación, que continúa ejecutándose y actualizándose, sin embargo, como mi actividad necesita las coordenadas de ubicación antes de que pueda mostrar cualquier cosa que la aplicación simplemente bloquee. Necesito mostrar un cuadro de diálogo de progreso mientras busco.
¿Cómo puedo hacer que el localizador se ejecute una vez en segundo plano y luego eliminar las actualizaciones de ubicación una vez que encuentra la ubicación. Necesito que el resto de la aplicación espere hasta que tenga una ubicación GPS o tiempo de espera después de decir 20-30segundos. Me gustaría un ProgressDialog para que el usuario sepa que algo está pasando, pero tiene que ser la animación de carga giratoria no un porcentaje ni nada. Si es posible, me gustaría que el usuario pueda cancelar el diálogo si está harto de esperar, para luego buscarlo escribiendo suburbio, etc.
He estado tratando de hacerlo con hilos, pero se está volviendo mucho más complicado de lo que creo que debería ser y todavía no funciona de todos modos. En iPhone esto es mucho más simple?
¿Alguien puede proporcionar una buena manera de hacer esto, he estado rompiéndome el cabello por una semana en esto y realmente me está retrasando por el resto de la fecha de finalización de la aplicación.
En resumen, quieren:
* Encuentra las coordenadas actuales
* Mostrar progresión al obtener la ubicación
* tener aplicación sea capaz de esperar para la localización exitosa o renunciar después de un cierto tiempo?
* If Successful: desestima el cuadro de diálogo Progress y usa las coordenadas para ejecutar mis otros métodos para encontrar elementos cercanos.
* Si no se pudo obtener la ubicación: descarte el cuadro de diálogo de progreso y muestre el mensaje de error, y anime al usuario a usar el menú para ir a la Actividad de búsqueda.
* Utilice estas coordenadas si el usuario elige la vista del mapa desde el menú, para mostrar la ubicación actual en el mapa y los pines eliminados en todos los elementos cercanos utilizando sus coordenadas de la base de datos.
Gracias chicos, espero haberme explicado lo suficiente. Si tiene alguna pregunta, lo visitaré regularmente ya que estoy ansioso por completar esta parte.Saludos
EDITAR
Código conforme a lo solicitado
fichero de actividad locationList
protected void onStart()
{
super.onStart();
// ....
new LocationControl().execute(this);
}
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
protected Void doInBackground(Context... params)
{
LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);
return null;
}
protected void onPostExecute(final Void unused)
{
if(this.dialog.isShowing())
{
this.dialog.dismiss();
}
useLocation(); //does the stuff that requires current location
}
}
public LocationResult locationResult = new LocationResult()
{
@Override
public void gotLocation(final Location location)
{
currentLocation = location;
}
};
clase LocationHelper
package org.xxx.xxx.utils;
import java.util.Timer;
/*
imports
*/
public class LocationHelper
{
LocationManager locationManager;
private LocationResult locationResult;
boolean gpsEnabled = false;
boolean networkEnabled = false;
public boolean getLocation(Context context, LocationResult result)
{
locationResult = result;
if(locationManager == null)
{
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
}
//exceptions thrown if provider not enabled
try
{
gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch (Exception ex) {}
try
{
networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch (Exception ex) {}
//dont start listeners if no provider is enabled
if(!gpsEnabled && !networkEnabled)
{
return false;
}
if(gpsEnabled)
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
}
if(networkEnabled)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
}
GetLastLocation();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
private void GetLastLocation()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
Location gpsLocation = null;
Location networkLocation = null;
if(gpsEnabled)
{
gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if(networkEnabled)
{
networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
//if there are both values use the latest one
if(gpsLocation != null && networkLocation != null)
{
if(gpsLocation.getTime() > networkLocation.getTime())
{
locationResult.gotLocation(gpsLocation);
}
else
{
locationResult.gotLocation(networkLocation);
}
return;
}
if(gpsLocation != null)
{
locationResult.gotLocation(gpsLocation);
return;
}
if(networkLocation != null)
{
locationResult.gotLocation(networkLocation);
return;
}
locationResult.gotLocation(null);
}
public static abstract class LocationResult
{
public abstract void gotLocation(Location location);
}
}
Esto realmente parece un gran esfuerzo solo para obtener la ubicación actual una vez? No necesito actualizaciones ni nada? ¿No hay una forma más simple de que la aplicación espere un resultado? He estado atrapado en esto por tanto tiempo.
http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-to-get-the-users-current-location-in-a/9811633#9811633 – Rajal