2011-03-31 20 views
10

Deseo implementar un LocationListener que cambie entre los proveedores de red y GPS en función de la disponibilidad.Alternar entre la red y el proveedor de GPS

Por ejemplo, si el GPS no está habilitado, quiero que use la red, pero tan pronto como el GPS esté encendido, quiero que deje de escuchar actualizaciones de ubicación de la red y comience a escuchar desde el GPS.

De manera similar, quiero que empiece a escuchar las actualizaciones de la red tan pronto como el GPS se apague.

¿Es esto posible?


de preguntas adicionales

es el GPS tan rápido como la red en la prestación de un reajuste de la ubicación?


Respuesta

9

Claro, que acaba de obtener los proveedores de la red y GPS y pasa lo que usted quiere locationManager.requestLocationUpdates().

Cuando desee dejar de escuchar a un determinado proveedor, llame al locationManager.removeUpdates() con el objeto detector que especificó en locationManager.requestLocationUpdates().

red:

Criteria crit = new Criteria(); 
crit.setPowerRequirement(Criteria.POWER_LOW); 
crit.setAccuracy(Criteria.ACCURACY_COARSE); 
String provider = locationManager.getBestProvider(crit, false); 

GPS:

Criteria crit2 = new Criteria(); 
crit2.setAccuracy(Criteria.ACCURACY_FINE); 
provider2 = locationManager.getBestProvider(crit2, false); 

Puede utilizar LocationManager.isProviderEnabled() doc para ver si el proveedor apropiado está activado/desactivado. Hay más información disponible en los documentos de LocationManager.

GPS suele ser mucho más lenta que la red ya que tienes que encontrar 3+ satélites lejanos, etc.

+1

Sí, pero cuando me inicializar el locationManager para solicitar actualizaciones de ubicación solo escuchará del proveedor al que estoy pasando. Es decir, 'locationManager.requestLocationUpdates (LocationManager.NETWORK_PROVIDER, minTime, minDistance, listener)' solo escuchará las actualizaciones de la red y ¡onProviderEnabled nunca se llamará para GPS! – mixkat

+0

Hay un método 'LocationManager.addGpsStatusListener()'. Cuando te dice que algo cambió, actúa en consecuencia. –

+0

¡No puedo hacer que esto funcione por alguna razón! Aunque agregué el gpsStatusListener al locationManager ¡el 'onGpsStatusChanged()' nunca se llama! – mixkat

1

estoy usando este

LocationManager locationManager; 
LocationListener locationListener; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    locationManager = (LocationManager) this 
      .getSystemService(Context.LOCATION_SERVICE); 
    String locationProvider = LocationManager.NETWORK_PROVIDER; 
    Location lastKnownLocation = locationManager 
      .getLastKnownLocation(locationProvider); 
    if (lastKnownLocation == null) { 
     locationProvider = LocationManager.GPS_PROVIDER; 
     lastKnownLocation = locationManager 
       .getLastKnownLocation(locationProvider); 
    } 
    if (lastKnownLocation != null) { 
     makeUseOfNewLocation(lastKnownLocation); 
    } 
    locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      makeUseOfNewLocation(location); 
     } 

     public void onStatusChanged(String provider, int status, 
       Bundle extras) { 
     } 

     public void onProviderEnabled(String provider) { 
     } 

     public void onProviderDisabled(String provider) { 
     } 
    }; 

    // Register the listener with the Location Manager to receive location 
    // updates 
    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     locationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
    } else { 
     locationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
    } 
} 
+0

Esto no es lo suficientemente flexible ... es mejor obtener ambos y decidir cuál es mejor – Vlad

+0

@Vlad ¿Cómo se puede decidir eso? – Hector

+1

@Hector Lea esto: http://developer.android.com/guide/topics/location/strategies.html – Vlad

Cuestiones relacionadas