Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Recomendaciones sobre permisos de la app

Las solicitudes de permisos protegen la información sensible disponible en un dispositivo y solo deben usarse cuando el acceso a la información es necesario para el funcionamiento de tu app. En este documento, se brindan sugerencias sobre las maneras de lograr la misma (o mejor) funcionalidad sin necesidad de acceder a esa información. No es un análisis exhaustivo sobre cómo funcionan los permisos en el sistema operativo Android.

Para obtener un panorama general sobre los permisos de Android, consulta la Descripción general de permisos. Para descubrir cómo trabajar con permisos en tu código, consulta Cómo solicitar permisos de la app.

Permisos en Android 6.0 y versiones posteriores

Android 6.0 Marshmallow introdujo un nuevo modelo de permisos mediante el cual las apps pueden solicitar permisos a los usuarios durante el tiempo de ejecución, en lugar de antes de la instalación. Las apps que admiten el nuevo modelo solicitan permisos cuando se necesitan los servicios o los datos protegidos por estos. Si bien esto no cambia (necesariamente) el comportamiento general de las apps, introduce algunas modificaciones relevantes en la manera en que se manejan los datos sensibles del usuario:

Mayor contexto situacional: En el contexto de tu app, se solicita permiso a los usuarios durante el tiempo de ejecución para acceder a las funcionalidades que abarcan esos grupos de permisos. Los usuarios son más sensibles al contexto en el que se solicita el permiso y, si lo que solicitas no coincide con el propósito de tu app, es incluso más importante proporcionarles una explicación detallada del motivo por el cual necesitas el permiso. Siempre que sea posible, debes proporcionar una explicación de la solicitud, tanto cuando la realizas como en un diálogo de seguimiento (si el usuario la rechaza).

Mayor flexibilidad para otorgar permisos: los usuarios pueden denegar el acceso a los permisos individuales en el momento en que se solicitan y en la configuración. Aún así, pueden sorprenderse cuando falla la funcionalidad como resultado de esto. Te recomendamos controlar la cantidad de usuarios que deniegan permisos (p. ej., con Google Analytics), de manera que puedas refactorizar tu app para evitar depender de ese permiso o proporcionar una mejor explicación del motivo por el cual lo necesitas para que tu app funcione correctamente. También debes asegurarte de que esta maneje excepciones creadas cuando los usuarios rechacen solicitudes de permisos o los desactiven en la configuración.

Mayor carga de transacciones: Se solicitará a los usuarios que otorguen acceso a grupos de permisos de manera individual y no en conjunto. Esto hace que minimizar la cantidad de permisos que solicitas sea sumamente importante, ya que aumenta la carga de otorgamiento de permisos para el usuario y la probabilidad de que se deniegue al menos una de las solicitudes.

Permisos que requieren convertirse en un controlador predeterminado

Algunas apps dependen del acceso a la información sensible del usuario que se relaciona con sus registros de llamadas y mensajes SMS. Si quieres solicitar los permisos específicos para registros de llamadas y mensajes SMS, y publicar tu app en Play Store, debes solicitar al usuario que configure tu app como controlador predeterminado para una función principal del sistema antes de solicitar estos permisos de tiempo de ejecución.

Para obtener más información sobre los controladores predeterminados, así como orientación sobre cómo mostrar una solicitud de estos a los usuarios, consulta la guía sobre permisos que se usan solo en controladores predeterminados.

Conoce las bibliotecas con las que trabajas

En ocasiones, las bibliotecas que usas en tu app requieren permisos. Por ejemplo, las bibliotecas de anuncios y estadísticas pueden requerir acceso al grupo de permisos LOCATION para implementar la funcionalidad requerida. Sin embargo, desde la perspectiva del usuario, la solicitud de permiso proviene de tu app, y no de la biblioteca.

Así como los usuarios seleccionan apps que usan menos permisos para la misma funcionalidad, los desarrolladores deben revisar sus bibliotecas y seleccionar SDK de terceros que no soliciten permisos innecesarios. Por ejemplo, si usas una biblioteca que proporciona la funcionalidad de ubicación, asegúrate de no solicitar el permiso FINE_LOCATION, a menos que estés usando la funcionalidad de orientación basada en la ubicación.

Limita el acceso en segundo plano a la ubicación

Cuando se ejecuta tu app en segundo plano, el acceso a la ubicación debe ser fundamental para la funcionalidad principal de la app y mostrar un beneficio claro a los usuarios.

Explica por qué se necesitan los permisos

En el diálogo de permisos que muestra el sistema cuando llamas a requestPermissions(), se indican los permisos que necesita tu app, pero no el motivo. A veces, esto puede confundir al usuario. Se recomienda explicarle los motivos por los cuales tu app necesita esos permisos antes de llamar a requestPermissions().

Algunas investigaciones muestran que los usuarios se sienten más cómodos con las solicitudes de permisos si saben para qué los necesita la app. Un estudio de usuarios mostró lo siguiente:

La disposición de un usuario para otorgar permiso a una app determinada se ve notablemente afectada por el propósito asociado con el permiso. Por ejemplo, la disposición de un usuario de otorgar acceso a su ubicación variará en función de si la solicitud se realiza para respaldar la funcionalidad central de la app o compartir esa información con una red de publicidad o una empresa de análisis de datos.1

Luego de colaborar con otras personas en relación con este tema, el profesor Jason Hong, de la CMU, concluyó que generalmente:

cuando las personas saben por qué una app usa información sensible, como su ubicación (por ejemplo, para publicidad orientada), se sienten más cómodas que cuando no se les da una explicación.1

En consecuencia, si solo usas una fracción de las llamadas de la API que pertenecen a un grupo de permisos, te será más fácil indicar explícitamente los permisos que usas y por qué. Por ejemplo:

  • Si solo usas la ubicación aproximada, infórmalo al usuario en la descripción de tu app o los artículos de ayuda.
  • Si necesitas acceso a mensajes SMS para recibir códigos de autenticación que protegen al usuario contra fraudes, infórmaselo en la descripción de tu app o la primera vez que accedas a los datos.

    Nota: Si tu app se orienta a dispositivos que ejecutan Android 8.0 (nivel de API 26) o una versión posterior, no solicites el permiso READ_SMS como parte de la verificación de las credenciales del usuario. En su lugar, genera un token específico de la app con createAppSpecificSmsToken() y, luego, pásalo a otra app o servicio que pueda enviar un mensaje de verificación por SMS.

En ciertos casos, resulta favorable informar a los usuarios respecto del acceso a datos sensibles en tiempo real. Por ejemplo, si accedes a la cámara o al micrófono, se recomienda que se lo informes al usuario con un ícono de notificación en algún sector de tu app, o en la bandeja de notificaciones (si la app se ejecuta en segundo plano), de manera que no parezca que recopilas datos de forma clandestina.

Por último, si tienes que solicitar un permiso para realizar alguna tarea en tu app, pero el motivo no está claro para el usuario, busca una manera de informarle por qué necesitas los permisos más sensibles.

Prueba ambos modelos de permisos

A partir de Android 6.0 (nivel de API 23), los usuarios otorgan y revocan permisos de apps durante el tiempo de ejecución, en lugar de hacerlo cuando instalan la app. Como resultado, tendrás que probar tu app en una variedad más amplia de condiciones. Antes de Android 6.0, podías suponer razonablemente que, si tu app estaba ejecutándose, significaba que tenía todos los permisos declarados en su manifiesto. A partir de Android 6.0, el usuario puede activar o desactivar los permisos de cualquier app, incluso una que se oriente al nivel de API 22 o inferior. Deberías realizar una prueba para asegurarte de que tu app funciona de manera correcta independientemente de si cuenta o no con los permisos.

Las siguientes sugerencias te ayudarán a encontrar los problemas de código relacionados con los permisos en los dispositivos que ejecutan el nivel de API 23 o superior:

  • Identifica los permisos actuales de tu app y las rutas de acceso de códigos relacionadas.
  • Prueba los flujos del usuario en los datos y servicios protegidos por permisos.
  • Prueba con varias combinaciones de permisos otorgados y rechazados. Por ejemplo, en el manifiesto de una app de cámara, podrían indicarse CAMERA, READ_CONTACTS, ACCESS_FINE_LOCATION. Debes probar la app con cada uno de esos permisos activados y desactivados, para asegurarte de que la app pueda controlar todas las configuraciones de permisos sin inconvenientes.
  • Usa la herramienta de adb para administrar los permisos desde la línea de comandos:
    • Enumera los permisos y estados por grupo:
      $ adb shell pm list permissions -d -g
    • Otorga o revoca uno o más permisos:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • Analiza tu app en busca de servicios que usen permisos.

Recursos adicionales

Referencias

[1] Modeling Users’ Mobile App Privacy Preferences: Restoring Usability in a Sea of Permission Settings, de J. Lin B. Liu, N. Sadeh y J. Hong. En actas de SOUPS 2014.