Estoy tratando de que se muestren las coordenadas GPS cuando hago clic en un botón en el diseño de mi actividad. El siguiente es el método que se llama cuando hago clic en el botón:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
Recibo un error que dice
La llamada requiere un permiso que puede ser rechazado por el usuario. El código debe verificar explícitamente si hay permiso disponible.
Ya he concedido estos permisos en mi AndroidManifest
. El error se soluciona y la aplicación se compila cuando agrego lo siguiente antes de llamar lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Sin embargo, la aplicación se bloquea cuando presiono el botón que llama a getLocation cuando se hace clic en él. Que esta pasando? ¿Existe una forma mejor o más sencilla de obtener las coordenadas GPS del dispositivo?
android
locationmanager
usuario
fuente
fuente
Respuestas:
Con el nivel de API de Android (23), debemos verificar los permisos. https://developer.android.com/training/permissions/requesting.html
Tuve el mismo problema, pero lo siguiente funcionó para mí y puedo recuperar los datos de ubicación con éxito:
(1) Asegúrese de tener sus permisos enumerados en el manifiesto:
(2) Asegúrese de solicitar permisos al usuario:
(3) Asegúrese de utilizar ContextCompat, ya que es compatible con niveles de API anteriores.
(4) En su servicio de ubicación, o clase que inicializa su LocationManager y obtiene la última ubicación conocida, debemos verificar los permisos:
(5) Este enfoque solo me funcionó después de incluir @TargetApi (23) en la parte superior de mi método initLocationService.
(6) También agregué esto a mi compilación de gradle:
Aquí está mi LocationService como referencia:
Probé con un dispositivo Android Lollipop solo hasta ahora. Espero que esto funcione para usted.
fuente
SOLUCIÓN SIMPLE
Quería admitir aplicaciones antes de la api 23 y, en lugar de usar
checkSelfPermission
, usé un try / catchfuente
La última parte del mensaje de error que citó dice:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
Una forma mucho más rápida / sencilla de comprobar si tiene permisos es rodear su código con
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Si tiene permisos, la parte 'probar' se ejecutará, si no los tiene, la parte 'atrapar' lo hará.fuente
Use mi clase personalizada para verificar o solicitar permiso
fuente
si está trabajando en permisos dinámicos y cualquier permiso como ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION dando el error "no se puede resolver el método PERMISSION_NAME" en este caso, escriba su código con el nombre del permiso y luego reconstruya su proyecto, esto regenerará el archivo de manifiesto (Manifest.permission).
fuente
Si simplemente desea verificar los permisos (en lugar de solicitar permisos), escribí una extensión simple como esta:
Ahora, si quiero verificar un permiso, simplemente puedo pasar un permiso como este:
fuente