Edité: Estoy reescribiendo esta pregunta porque al parecer no estaba claro.Android GPS tiempo de espera
A veces, el servicio de GPS en los teléfonos con Android tarda mucho tiempo en arreglarse. A veces es rápido, a veces lleva horas. Lo sé y acepto esto.
Tengo una aplicación que hace muchas cosas. Una de las cosas que debe hacer es permitir que el usuario haga clic en un botón para enviar sus coordenadas actuales a un servidor. Lo que necesito son las coordenadas del teléfono cuando el usuario hace clic en el botón o dentro de un tiempo razonablemente corto después de eso.
Como sé que obtener una corrección de GPS no es instantáneo y sé que podría tomar minutos u horas (durante las cuales el usuario se ha movido una gran distancia), necesito programar un tiempo de espera para esta función. Para esta característica, simplemente no es aceptable cargar la ubicación del GPS del usuario tres minutos (por ejemplo) después de hacer clic en el botón. Está bien si lleva 45 segundos, no está bien si lleva 75 segundos. Está bien dar al usuario una notificación de error si la característica no logró obtener una ubicación lo suficientemente rápido.
Necesito una función para 'obtener la ubicación del GPS y enviarla al servidor, a menos que tome más de un minuto'.
Mi código original está por debajo. He cambiado algunas cosas desde que lo publiqué. He agregado un temporizador en el método onStartCommand(). Comienzo un TimerTask que después de 60 segundos llamará a mi método stop(). Al comienzo del método onLocationChanged(), cancelo TimerTask.
Mi pregunta es: ¿Es el esquema del temporizador una buena forma de implementar este tiempo de espera? ¿Hay una mejor manera?
pregunta original:
Estoy escribiendo una aplicación para Android que, entre otras cosas, tiene que enviar las coordenadas de GPS actual a un servidor cuando el usuario lo indica. Desde un menú contextual, ejecuto el servicio a continuación. El servicio es un LocationListener y solicita actualizaciones del LocationManager. Cuando obtiene una ubicación (onLocationChanged()), se elimina como un oyente y envía las coordenadas al servidor. Todo esto está funcionando.
Sin embargo, si las coordenadas de GPS no están disponibles rápidamente, mi servicio sigue funcionando hasta que se recupera. Mantiene la interfaz de usuario con un diálogo de progreso, que es molesto. Peor aún, si el usuario se ha movido desde que comenzó el servicio, las primeras coordenadas de GPS podrían estar equivocadas y la aplicación enviará datos incorrectos al servidor.
Necesito un tiempo de espera en el servicio. ¿Hay una buena manera de hacer eso? No tengo mucha experiencia con los hilos. Creo que puedo ejecutar un Runnable en el método onStartCommand() que de alguna manera contará hacia abajo 30 segundos y luego, si aún no hay un resultado de GPS, llame al método stop() de mi servicio. ¿Eso suena como la mejor manera de hacer esto?
Como alternativa, ¿es posible decir si el GPS no puede obtener una solución? ¿Cómo voy a hacer eso?
Edit: Para aclarar más, estoy buscando la mejor manera de "renunciar" a obtener una ubicación después de un período de tiempo.
public class AddCurrentLocation extends Service implements LocationListener {
Application app;
LocationManager mLocManager;
ProgressDialog mDialog;
@Override
public int onStartCommand(Intent intent, int arg0, int arg1) {
app = getApplication();
// show progress dialog
if (app.getScreen() != null) {
mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
}
// find GPS service and start listening
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String bestProvider = mLocManager.getBestProvider(criteria, true);
mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);
return START_NOT_STICKY;
}
private void stop() {
mLocManager.removeUpdates(this);
if (mDialog != null) {
mDialog.dismiss();
}
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
// done with GPS stop listening
mLocManager.removeUpdates(this);
sendLocation(location); // method to send info to server
stop();
}
// other required methods and sendLocation() ...
}
entonces, ¿qué hizo después de todo para resolverlo? Tengo el mismo problema. – sexitrainer