Los nuevos permisos en Android

Los nuevos permisos en Android

En este articulo ilustraremos el nuevo código que se debe acompañar en los permisos de Android con el lanzamiento de algunos intents.

Un intent (o intención) en Android representa la voluntad de realizar alguna acción o tarea, por ejemplo:

  • como realizar una llamada de teléfono
  • visualizar una página web
  • enviar un correo, etc

Una intención también nos permite lanzar una actividad o servicio de nuestra aplicación o de una aplicación diferente. Existen dos tipos de intenciones:

  • Intenciones explícitas: se indica exactamente el componente a lanzar. Su utilización típica es la de ir ejecutando los diferentes componentes internos de una aplicación. Por ejemplo cuando desde una actividad se lanza otra actividad de forma explícita.
  • Intenciones implícitas: pueden solicitar tareas abstractas, como “quiero tomar una foto” o “quiero enviar un mensaje”. Se resuelven en tiempo de ejecución, de forma que el sistema mirará cuantas aplicaciones han registrado la posibilidad de ejecutar ese tipo de actividad. Si encuentra varias el sistema puede preguntar al usuario la actividad que prefiere utilizar.

Por otro lado, una aplicación básica de Android no tiene permisos asociados de manera predeterminada. No puede hacer nada que afecte negativamente la experiencia del usuario o los datos en el dispositivo. Para usar funciones protegidas del dispositivo y dar permisos, se deben incluir etiquetas del tipo <uses-permission> en el manifest de la aplicación.

Por ejemplo, una aplicación que quiera acceder a Internet, necesita introducir la siguiente línea en el AndroidManifest:  <uses-permission android:name=”android.permission.INTERNET”/>

Las acciones que no presentan un gran riesgo para la privacidad del usuario o el funcionamiento del dispositivo, basta con poner el <uses-permission> correspondiente en el AndroidManifest de la aplicación (permisos normales). Pero aquellas otras acciones con más riesgo, que podrían afectar a la privacidad del usuario o el funcionamiento normal del dispositivo, el sistema solicita al usuario que otorgue explícitamente esos permisos.

La manera en que Android realiza la solicitud depende de la versión del sistema y de la versión del sistema objetivo de la aplicación:

  • Si el dispositivo tiene instalado Android 6.0 (nivel de API 23) o versiones posteriores y el atributo targetSdkVersion de la app es 23 o superior, la aplicación solicita los permisos al usuario en el tiempo de ejecución. El usuario puede revocar los permisos en cualquier momento. Por ello, la aplicación  debe controlar si tiene los permisos cada vez que se ejecuta.
  • Si el dispositivo tiene instalado Android 5.1 (nivel de API 22) o versiones anteriores, o el atributo  targetSdkVersion de la app es 22 o un valor inferior, el sistema solicita al usuario que otorgue los permisos al instalar la aplicación. Si agregas un permiso nuevo a una versión actualizada de la aplicación, el sistema solicita al usuario que otorgue ese permiso al actualizar la app. Una vez que el usuario instale la aplicación, la única manera que tiene de revocar el permiso es desinstalando la aplicación.

Vamos a ver mediante un ejemplo el lanzamiento de los siguientes intents: ACTION_VIEW, ACTION_DIAL, ACTION_IMAGE_CAPTURE, ACTION_SEND, ACTION_WEB_SEARCH y ACTION_CALL. Examinaremos los restricciones de permisos que nos impone una aplicación con minSDKVersion de 25 y targetSdlVersion de 29.

 

En el layout principal definimos 8 botones con las siguientes propiedades y eventos onClick:

 

 

En el MainActivity definimos las funciones evento-click correspondiente a cada botón del layout:

 

A priori el único intent que nos reclama atención es ACTION_CALL. El resto de intents no marcan ningún error.

 

 

Nos indica que debemos agregar una etiqueta <uses-permission> con el nombre android.permission.CALL_PHONE en el AndroidManifest:

 

 

Una vez vez agregado el permiso, nos vuelve a indicar otro mensaje:

 

 

Esto lo solucionamos temporalmente lanzando la excepción hacia fuera y haciendo la aplicación compilable:

 

 

Ejecutamos la aplicación y comprobamos que todos los botones funcionan perfectamente, excepto el boton de CALL_PHONE que hace finalizar la aplicación. El resultado es el siguiente:

 

  • ABRIR PAGINA WEB/LLAMADA DE TELEFONO (DIAL)/GOOGLEMAPS/TOMAR FOTO

 

 

  • MANDAR CORREO/ABRIR PAGINA WEB (WEB_SEARCH)/STREETVIEW

 

 

 

Podemos observar que tanto los intents ACTION_SEND, como el WEB_SEARCH son del tipo implícito, los cuales, como hemos comentado anteriormente, se resuelven en tiempo de ejecución, invitando al usuario a que elija de entre todas las aplicaciones que pueden realizar esa actividad, la que desee utilizar.

El intent ACTION_CALL necesita de una forma especial de programar los permisos. No basta con poner el correspondiente <uses-permission> en el AndroidManifest. Se necesita un código que pregunte al usuario si desea permitir o denegar los permisos de la aplicación en tiempo de ejecución. He aqui un ejemplo de este código, necesario para API de Android altas:

 

 

El resultado es el siguiente al apretar el botón “Llamada de telefono (call)”:

 

 

Espero que os haya resultado interesante,

Saludos y hasta el próximo artículo!

1 Comentario

  • gemma
    04/01/2020

    Permíteme que me disculpe por mi ignorancia en el tema de los móviles… yo solo lo uso para llamar, whassap, fotos, videos, y el uso cotidiano al que estamos acostumbrados los ” usuarios “.. sin embargo, después de tu exposición, cuando miro mi móvil me sorprendo pensando que algo tan minimamente pequeño sea tan grande a la hora de proporcionar información u obtenerla, y doy las gracias a los programadores por ser capaces de facilitarnos con un solo boton que podamos realizar nuestros deseos con un solo dedo ……..y lo poco que sabemos sobre lo que diariamente tenemos entre las manos….

Escribe un comentario