2011-02-17 4 views
5

Estoy escribiendo un método que devolverá verdadero si hay un sensor GPS presente y habilitado, pero devuelve falso si está ausente o apagado. Está resultando difícil porque ...¿Cómo verificar la presencia de un sensor de GPS?

hasSystemFeature("FEATURE_LOCATION_GPS") // on PackageManager 

Devuelve falso, si el dispositivo tiene un GPS o no. Entonces, incluso en un dispositivo que tiene uno, y está encendido, todavía devuelve falso. Me parece completamente incorrecto, pero no puedo ver por qué.

isProviderEnabled("gps") // on LocationManager 

Devuelve cierto, incluso en un dispositivo que tengo aquí que no tiene ningún hardware de GPS en absoluto. Eso también parece completamente contra-intuitivo.

Acepto que estos resultados podrían deberse a que me falta algo, el SDK no es intuitivo, o incluso que los dispositivos con los que estoy probando se están comportando de manera extraña.

¿Qué me estoy perdiendo?

Respuesta

13

Esto debería funcionar. ¿Hay algún mensaje de error en Logcat cuando realiza esta llamada?

PackageManager pm = getPackageManager(); 
boolean hasGps = pm.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS); 
+0

No hay error, pero devuelve verdadero en un dispositivo que no tiene un GPS en absoluto (Advent Vega 10 "tableta no aprobada por Google). Tal vez la culpa es culpa de la tableta y el sistema operativo está incorrectamente configurado en el dispositivo. –

+1

Bueno, el desarrollador del dispositivo tiene que implementar una clase PackageManager ya que el SDK PackageManager es abstracto. No sería la primera vez que un desarrollador de dispositivos rompió algo. –

+0

Probé esto en Kinde Fire (sin GPS) y funciona como un encanto. (Supongo que no vale la pena apoyar craps aprobados no aprobados por Google) –

1

Su hasSystemFeature() probablemente siempre devuelve falso porque FEATURE_LOCATION_GPS es una referencia a una constante, y no una cadena literal. Creo que el literal de cadena actual al que apunta es en realidad "android.hardware.location.gps".

Creo que lo que busca es algo como esto:

LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
if(!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    //Ask the user to enable GPS 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Location Manager"); 
    builder.setMessage("Would you like to enable GPS?"); 
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      //Launch settings, allowing user to make a change 
      Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(i); 
     } 
    }); 
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      //No location service, no Activity 
      finish(); 
     } 
    }); 
    builder.create().show(); 
} 

que añade el extra de la AlertDialog señalar que se puede llevar al usuario a la página de configuración de la ubicación directamente a tenerlos permiten GPS utilizando la acción de intención Settings.ACTION_LOCATION_SOURCE_SETTINGS.

Espero que ayude!

+0

Sí, por supuesto, la cadena necesita venir a través de la constante estática. Lo perdí ya que la constante solo está en API8 y en adelante, y estoy apuntando a API5 Pero agregué la constante manualmente como una cadena, y funciona. Espero que no funcione en todos los escenarios, pero es solo una prueba para mejorar la interfaz de usuario cuando Así que no es un problema bi si falla para algunos, no lo sabrán. Gracias. –

+1

Hablé demasiado pronto. hasSystemFeature ("android.hardware.location.gps") devuelve verdadero para el dispositivo con GPS y el dispositivo sin. Qué frustrante es que algo tan simple esté resultando tan difícil. isProviderEnabled (Ubicación.GPS_PROVIDER) sigue siendo verdadero, incluso cuando el dispositivo no tiene GPS en absoluto. –

+0

¿Con qué dos dispositivos está probando? Además, pensé que podría señalar que 'LocationManager.getAllProviders()' no tendrá 'LocationProvider.GPS_PROVIDER' en su lista devuelta si no es compatible, lo que sería otra forma de comprobar si existe GPS. – Devunwired

2

En caso de que el dispositivo no tiene hardware de GPS se cumple lo siguiente:

locationManager.getProvider(LocationManager.GPS_PROVIDER) == null; 

Dónde

LocationManager locationManager = (LocationManager) AppCore.context().getSystemService(Context.LOCATION_SERVICE); 

En mi caso el * hasSystemFeature (PackageManager.FEATURE_LOCATION_GPS) * devuelve cierto incluso si el dispositivo no tiene GPS Entonces no es confiable.

Cuestiones relacionadas