Cómo superar la adquisición de señales GPS
Mi aplicación utiliza el LocationListener para obtener una corrección de posición y luego removeUpdates()
una vez cada minuto (para conservar la batería). El problema es que si un usuario se mueve dentro, entonces continuamente buscará una señal, quemando más batería. Me preguntaba si alguien sabe de un método público dentro del Administrador de ubicación que puedo utilizar para removeUpdates si una señal no se adquiere en 15 segundos. Entonces comprobaría para una posición fijar cada cinco minutos hasta que el usuario se mueva hacia fuera al aire libre. ¿Esto tiene sentido? Tal vez hay un mejor método para la adquisición de señal GPS de tiempo de espera? He mirado a través de los métodos públicos de la gerencia de la localización pero no puedo parecer encontrar una manera de hacerlo. ¡Muchas gracias por su ayuda! Dom
- El emulador de Android no puede reconocer que el GPS está habilitado
- ¿Cómo puedo obtener el nombre de la ciudad de mi posición actual?
- Comprobación de si el GPS está habilitado en android
- Cómo obtener el nombre de satélite o el número cuando estamos recibiendo la ubicación a través de GPS en Android?
- ¿Conseguir ubicación GPS en el modo de alta precisión deduce el dinero de nuestra balanza?
- Android GPS no funciona hasta que se reinicie en nuevos teléfonos
- Las actualizaciones GPS no se apagan después de cerrar la aplicación
- El oyente de ubicación funciona desde un servicio pero no es un servicio de IntentService
- ¿Cómo obtener el dato real que android GPS está usando?
- Servicios de Google Play o Servicios de ubicación de Android
- ¿Cómo obtener datos GPS desde un teléfono Android?
- Cómo comprobar si las coordenadas de una ubicación caen a otra ubicación coordenadas de radio en android
- Fijación GPS más rápida en Android
Aunque la respuesta de GPSmaster es aceptada, quiero publicar el enlace a una solución más elegante y más simple, creo – https://gist.github.com/777790/86b405debd6e3915bfcd8885c2ee11db2b96e3df . Lo he probado yo mismo y funcionó =)
En caso de que el enlace no funcione, este es un LocationListener
personalizado por amay077 :
/** * Initialize instance. * * @param locaMan the base of LocationManager, can't set null. * @param timeOutMS timeout elapsed (mili seconds) * @param timeoutListener if timeout, call onTimeouted method of this. */ public TimeoutableLocationListener(LocationManager locaMan, long timeOutMS, final TimeoutLisener timeoutListener) { this.locaMan = locaMan; timerTimeout.schedule(new TimerTask() { @Override public void run() { if (timeoutListener != null) { timeoutListener.onTimeouted(TimeoutableLocationListener.this); } stopLocationUpdateAndTimer(); } }, timeOutMS); } /*** * Location callback. * * If override on your concrete class, must call base.onLocation(). */ @Override public void onLocationChanged(Location location) { stopLocationUpdateAndTimer(); } @Override public void onProviderDisabled(String s) { } @Override public void onProviderEnabled(String s) { } @Override public void onStatusChanged(String s, int i, Bundle bundle) { } private void stopLocationUpdateAndTimer() { locaMan.removeUpdates(this); timerTimeout.cancel(); timerTimeout.purge(); timerTimeout = null; } public interface TimeoutLisener { void onTimeouted(LocationListener sender); }
Así que esto es lo que terminé haciendo.
Esto es lo que he añadido a la etiqueta LocationListener las variables globales timertest y loccounter:
public class MyLocationListener implements LocationListener { public void onStart() { if (timertest==false) { timertest=true; serviceHandler = new Handler(); serviceHandler.postDelayed( new timer(),1000L ); } } class timer implements Runnable { public void run() { ++loccounter; if (runtest==true && loccounter>8) { dt=200; runtest=false; stoplistening(); } else serviceHandler.postDelayed( this, 1000L ); } } }
Inicie el temporizador justo antes de solicitar las actualizaciones de la ubicación.
public void locupdate(int minTime, float minDistance) { mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); mlocListener = new MyLocationListener(); if (mlocListener != null && mlocManager != null) { mlocManager.removeUpdates(mlocListener); } loccounter=0; ((MyLocationListener) mlocListener).onStart(); runtest=true; mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, mlocListener); }
Y un último método dentro del oyente de localización:
public void stoplistening() { mlocManager.removeUpdates(mlocListener); loccounter=0; }
Espero que esto ayude a alguien
Bueno, mi solución a este problema es algo muy simple y no sé si es una buena práctica. Supongamos que tenemos un nombre de long
llamado timeToQuit
que determina cuántos timeToQuit
que desea esperar antes de abortar la búsqueda de una posición acaba de poner:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, locationListener); Handler handler = new Handler(); // android.os.Handler Runnable runnable = new Runnable() { @Override public void run() { locationManager.removeUpdates(locationListener); } }; handler.postDelayed(runnable, timeToQuit);
Por supuesto usted tiene que tener un LocationListener y su propio LocationListener. Los valores en locationManager.requestLocationUpdates son de mi aplicación, por lo que conviene adaptarlos. Este código funciona como un encanto para mí. Sé que estoy un poco tarde, pero no pude encontrar este enfoque en ninguna parte y propably ayuda a alguien. Aclamaciones
- Picasso sigue recargando imágenes mientras se desplaza hacia arriba en listview, carga lentamente
- Retrofit 2 no puede cargar un archivo con dos parámetros adicionales de cadena separados