Permisos en Android

Asignación de permisos en Android

Los permisos sirven para permitir acceso a funciones protegidas de un dispositivo. En Android existen dos clases de permisos: permisos normales y permisos riesgosos o peligrosos. Los permisos normales son los que no suponen un gran riesgo para la privacidad del usuario y se otorgan automáticamente, mientras que los permisos peligrosos si pueden suponer un riesgo a la privacidad, ya que permite a la aplicación acceder a datos que pueden ser vulnerables y por ello se requiere la confirmación del usuario. Todos los permisos peligrosos que pertenecen a Android pertenecen a un grupo de permisos.

ASIGNAR PERMISOS

A pesar de que Android permite definir permisos personalizados dispone de una lista de permisos, que suelen ser suficientes en la mayoría de los casos.

La asignación de permisos se realiza en el archivo AndroidManifest.xml.

Ejemplo de asignación de permiso de escritura del almacenamiento externo.

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

SOLICITAR PERMISOS

La solicitud de permisos depende de la versión del sistema Android disponible. Si el dispositivo dispone de una versión 6.0 (API 23) o superior, la solicitud se realiza en tiempo de ejecución, es decir, en el momento que la acción de la aplicación requiere esos permisos. Si la versión es 5.1.1 (API 22)  o inferior el sistema realiza la solicitud en el proceso de instalación de la aplicación. 

La solicitud se realiza mediante una comprobación utilizando el método checkSelfPermission() de la clase ContextCompat o de la subclase ActivityCompat  obteniendo como resultado un permiso concedido o un permiso denegado.

  1. if(ContextCompat.checkSelfPermission(MainActivity.this,
  2. Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
  3. }

SOLICITAR PERMISOS EN TIEMPO DE EJECUCIÓN

Para solicitar este tipo de permisos primero se debe realizar una solicitud y si la respuesta resulta un permiso denegado, se envía una ventana de solicitud al usuario que permite aceptar o denegar dicho permiso. Este tipo de solicitud se realiza mediante el método requestPermission() de la clase ActivityCompat  y el tipo de ventana se encuentra definida por el sistema que puede variar de una versión a otra de Android.

  1. if(ContextCompat.checkSelfPermission(MainActivity.this,
  2. Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
  3. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
  4. }

CONTROL DE RESPUESTA

Otra opción más que ofrece Android es el control de respuesta de la solicitud. Esto es posible sobreescribiendo el método onRequestPermissionsResult() que permite realizar cualquier acción si el usuario deniega la solicitud o incluso se puede detectar si se ha marcado la casilla "no volver a mostrar".

  1. @Override
  2. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  3. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  4. switch (requestCode){
  5. case PERMISSION_REQUEST_WRITE_EXTERNAL:
  6. if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
  7. Log.i("Permisos","Permisos concedidos");
  8. }else{
  9. if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
  10. Manifest.permission.WRITE_EXTERNAL_STORAGE)){
  11. Log.i("Permisos","Los permisos han sido denegados");
  12. }else{
  13. Log.i("Permisos","Los permisos y volver a preguntar han sido denegados");
  14. }
  15. }
  16. break;
  17. }
  18. }

Ejemplo de solicitud de permiso

En este ejemplo se realiza una solicitud en tiempo de ejecución mediante un método (miMetodo) que exige aceptar la solicitud para poder pasar al método guardarArchivo() y procesar el archivo. Esto se hace simplemente añadiendo un comando "return" que detiene la ejecución.

  1. public void miMetodo(){
  2. if(ContextCompat.checkSelfPermission(MainActivity.this,
  3. Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
  4. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_WRITE_EXTERNAL);
  5. return;
  6. }
  7. guardarArchivo();
  8. }

Ejemplo de solicitud  con control de respuesta

Este ejemplo permite mostrar las distintas acciones de una solicitud en tiempo de ejecución que se pueden realizar tanto si el usuario acepta el permiso, lo rechaza o lo rechaza junto con la casilla marcada de "no volver a mostrar". 

  1. public void creatFile(){
  2. if(ContextCompat.checkSelfPermission(context,
  3. Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
  4. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_WRITE_EXTERNAL);
  5. return;
  6. }
  7. CreateAndWrite(sd);
  8. }
  9. @Override
  10. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  11. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  12. switch (requestCode){
  13. case PERMISSION_REQUEST_WRITE_EXTERNAL:
  14. if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
  15. Log.i("Permisos","Permiso correcto");
  16. //CreateAndWrite(sd);
  17. }else{
  18. if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
  19. Manifest.permission.WRITE_EXTERNAL_STORAGE)){
  20. Toast.makeText(context,"Los permisos son necesarios",Toast.LENGTH_LONG).show();
  21. Log.i("Permisos","Deniega permisos");
  22. }else{
  23. Toast.makeText(context,"Puede activar los permisos en los ajustes de la apliación",Toast.LENGTH_LONG).show();
  24. }
  25. }
  26. break;
  27. }
  28. }

Nota: El usuario siempre puede modificar los permisos desde la opción de ajustes manualmente.

Comentarios: 0

Para poder comentar es necesario iniciar sesión



Este dominio utiliza cookies de terceros para crear estadísticas y publicidad personalizada. Si continúa navegando está aceptando su uso