2011-02-05 13 views
17

Quiero seleccionar un LocationProvider que esté habilitado en Android. El objetivo de compilación del proyecto es Android 2.1.LocationManager: ¿el proveedor de "red" siempre está habilitado?

Esto es lo que hago en onCreate().

// ... 
LocationManager locationMgr = (LocationManager) 
getSystemService(Context.LOCATION_SERVICE); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.NO_REQUIREMENT); 
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); 
criteria.setCostAllowed(false);  

String bestProvider = locationMgr.getBestProvider(criteria, true); 

Toast.makeText(getApplicationContext(), "Provider = " + bestProvider + " enabled= " + locationMgr.isProviderEnabled(bestProvider), Toast.LENGTH_LONG).show(); 
// ... 

Ahora, cada conmutador de interfaz de red apagado y el modo de vuelo en mi dispositivo (HTC Desire, Android 2.2). Desconecto el dispositivo de USB. Claramente, no hay ningún proveedor vivo que pueda proporcionar datos de ubicación al dispositivo. Solicito específicamente getBestProvider solo para proveedores habilitados, por lo que espero que devuelva null o una cadena vacía en ese caso. Espero isProviderEnabled para devolver falso.

El resultado real es que getBestProvider devuelve "red" y isProviderEnabled informes que pueda ser "activado". ¿Está "activada" la "red" incluso cuando no es así?

+0

Esto también puede deberse a la ubicación de la red de caché de Android, ya que es poco probable que cambie pronto debido a la granularidad gruesa. Sin embargo, eso solo es una suposición. –

Respuesta

21

Después de algunas excavaciones que puedo responder a mi propia pregunta. Primero probé con el modo avión:

ConnectivityManager connectivityMgr = (ConnectivityManager) 
getSystemService(Context.CONNECTIVITY_SERVICE); 

NetworkInfo[] nwInfos = connectivityMgr.getAllNetworkInfo(); 
for (NetworkInfo nwInfo : nwInfos) { 
    Log.d(TAG, "Network Type Name: " + nwInfo.getTypeName()); 
    Log.d(TAG, "Network available: " + nwInfo.isAvailable()); 
    Log.d(TAG, "Network c_or-c: " + nwInfo.isConnectedOrConnecting()); 
    Log.d(TAG, "Network connected: " + nwInfo.isConnected()); 
} 

Los ConnectivityManager informes correctamente "falso", ya que no hay conexión. Esto es útil para verificar si realmente tiene una red y, por lo tanto, un proveedor de ubicación basado en la red disponible. Luego eché un segundo vistazo a la configuración de mi dispositivo. Y aquí está la respuesta:

locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 

informes si el usuario ha obtenido la configuración del dispositivo (en mi caso bajo Ubicación - Mi ubicación). Si desmarca todos los proveedores allí, devuelve nulo como se esperaba. En realidad está documentado en isProviderEnabled(), pero debo haberlo pasado por alto. Caso cerrado.

+1

¡Gracias por el seguimiento! –

+0

'isProviderEnabled()' debe devolver falso en este ejemplo, ¿verdad? No puede tener un método con un tipo de retorno primitivo que devuelve nulo. Quizás te refieres a 'getBestProvider()'? –

+0

¿Alguna vez encontró una solución a este problema? En mi teléfono Galaxy S IV en la configuración, he configurado 'Permisos' -> 'Servicios de ubicación' -> 'Usar redes inalámbricas' para que sea VERDADERO. Sin embargo, si apago todo (apago el GPS, la WiFi y la radio celular, y también habilito el modo avión), 'isProviderEnabled (LocationManager.NETWORK_PROVIDER)' aún devuelve TRUE. – stackoverflowuser2010

1

probar este

public static boolean isLocationSensingAvailable() 
{ 
    boolean hasActiveLocationProvider = false; 
    List<String> providers = locationManager.getProviders(true); 
    for (String providerName:providers) 
    { 
     if (providerName.equals(LocationManager.GPS_PROVIDER)) 
     { 
      hasActiveLocationProvider = isLocationProviderEnabled(providerName); 
     } 
     if (providerName.equals(LocationManager.NETWORK_PROVIDER)) 
     { 
      hasActiveLocationProvider = (SpondleApplication.isOnline() && isLocationProviderEnabled(providerName)); 
     } 
    } 
    return hasActiveLocationProvider; 
} 
+0

Gracias por la respuesta rápida Ollie. Debo agregar que sé cómo solucionar la situación. Estoy interesado en obtener una respuesta si el resultado de ** getBestProvider ** y ** isLocationProviderEnabled ** es siempre como lo describí, es decir, si "network" siempre se informa como "enabled", incluso cuando no lo es. –

1

Siempre se cumple como una respuesta porque ha seleccionado la opción "Usar redes" en el menú de configuración. También tuve este problema hasta que descubrí esto. Espero que encuentres esto útil.

Cuestiones relacionadas