2010-01-02 22 views
5

Estoy usando el método requestLocationUpdates() del administrador de ubicación para recibir periódicamente un intento para mi receptor de difusión. El sistema está disparando correctamente el intento a mi receptor, y he podido usarlo correctamente. El único problema es que el proveedor de ubicación GPS solo se mantiene activo durante unos segundos después de la adquisición de la ubicación inicial, y necesito que permanezca un poco más para que las estimaciones de ubicación sean más precisas.Android: ¿Cómo mantener el GPS activo hasta que se proporcione una ubicación más precisa?

Mi pregunta es cómo hacer que el proveedor de ubicación GPS permanezca activo para cada solicitud periódica que proviene de LocationManager requestLocationUpdates. ¿Alguien sabe como hacer esto?

Respuesta

7

Pruebe algo como esto. Creo que es el enfoque correcto

private void createGpsListner() 
{ 
    gpsListener = new LocationListener(){ 
     public void onLocationChanged(Location location) 
     { 
      curLocation = location; 

      // check if locations has accuracy data 
      if(curLocation.hasAccuracy()) 
      { 
       // Accuracy is in rage of 20 meters, stop listening we have a fix 
       if(curLocation.getAccuracy() < 20) 
       { 
        stopGpsListner(); 
       } 
      } 
     } 
     public void onProviderDisabled(String provider){} 
     public void onProviderEnabled(String provider){} 
     public void onStatusChanged(String provider, int status, Bundle extras){} 
    }; 
} 

private void startGpsListener() 
{ 

    if(myLocationManager != null) 
     // hit location update in intervals of 5sec and after 10meters offset 
     myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, gpsListener); 
} 

private void stopGpsListner() 
{ 
    if(myLocationManager != null) 
     myLocationManager.removeUpdates(gpsListener); 
} 
+1

gracias por el código. hasAccuracy y getAccuracy me han ayudado. Pero una duda, si gps no tiene precisión dentro de 20 (en algún lugar podría ser), entonces seguirá buscando ryt? ¿Qué hay que hacer? – SSS

0

si mantiene su LocationListener activo, debería continuar recibiendo actualizaciones en onLocationChanged() si la precisión del arreglo se reduce. y de hecho location.getAccuracy() le dirá la precisión actual

¿puede establecer minTime y minDistance a 0 para recibir actualizaciones con mayor frecuencia? utilizará más batería, pero es más preise.

+1

soy utilizando un receptor de difusión con la versión PendingIntent del método. Además, la precisión del arreglo mejora, pero deja de actualizarse mucho antes de su potencial de precisión, por lo que no puedo usar getAccuracy(). Necesito que continúe actualizándose hasta que la precisión mejore mucho y no espere lo suficiente. – Doughy

+0

No estoy usando una alerta de proximidad. Estoy solicitando que el LocationManager me proporcione correcciones periódicas que regresen a mi aplicación a través de un receptor de transmisión, lo que ocurre cada vez que la ubicación "cambia". El LocationManager o el proveedor de ubicación GPS no permanecen activos el tiempo suficiente para que las ubicaciones sean muy precisas. Incluso si uso un oyente, eso no cambia el hecho de que el GPS no permanece activo por mucho tiempo. – Doughy

+0

¿Ha probado la sugerencia de jspcal de establecer el minTime en 0 o similar? Si eso le proporciona actualizaciones frecuentes que pronto se vuelven lo suficientemente precisas (o después de un tiempo de espera), puede actualizar la solicitud de actualizaciones de LocationManager al valor minTime deseado. –

0

para obtener la ubicación GPS de forma periódica, obtener la ubicación de onLocationChanged método de LocationListener y en onResume método de especificar el tiempo en milliseconds para obtener actualizaciones periódicas

onResume 
location_manager.requestLocationUpdates(provider, 1000, 1, MainActivity.this); 
Cuestiones relacionadas