1 de febrero de 2016

Android: Comprobar si el usuario ha autorizado los permisos del Manifest a partir de la API 23

Desde la API 23 Google va a obligar a las aplicaciones a solicitar la autorización expresa del usuario para poder acceder a datos sensibles como por ejemplo la localización del usuario.

Hasta ahora bastaba con agregar los correspondientes permisos al manifest de la app, cuando el usuario se instalaba la app se le informaba simplemente. A partir de esta API y a imagen y semejanza de lo que hace iOS desde su versión 8 la app debe solicitar expresamente al usuario durante la ejecución el acceso a estos datos.

Para ello el primer paso es comprobar si tenemos o no el permiso ya concedido, por ejemplo:

if (ContextCompat.checkSelfPermission(context,
        Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {

}


En este caso estamos comprobando si tenemos el permiso de acceso para determinar la localización más cercana, muy importante pasar el contexto adecuado a la variable context. En concreto en esta comparación nos aseguramos de no tener ese permiso para a continuación solicitarlo:

ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
        MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION es una constante que hay que declarar del siguiente modo al inicio:

public static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 0;

Ahora nos toca ver que hacemos si nos conceden o no el permiso:

@Overridepublic void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
            // If request is cancelled, the result arrays are empty.            if (grantResults.length > 0                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the                // contacts-related task you need to do.
            } else {

                // permission denied, boo! Disable the                // functionality that depends on this permission.            }
            return;
        }

        // other 'case' lines to check for other        // permissions this app might request    }
}

Espero que os haya sido de utilidad.