Permission Group es un mecanismo de agrupación de permisos en Android que combina permisos peligrosos relacionados funcionalmente en una categoría lógica. Según Android Permissions Overview, 2024, los grupos de permisos simplifican la interfaz de usuario: si el usuario ha concedido un permiso de un grupo, los demás se otorgan automáticamente sin diálogos adicionales. Esto reduce la cantidad de solicitudes y mejora la UX.
Puntos Clave
Permission Group es un mecanismo del sistema Android que agrupa varios permisos peligrosos en un grupo según su propósito funcional. Cada grupo tiene un identificador de cadena, por ejemplo android.permission-group.CAMERA o android.permission-group.LOCATION. Todos los permisos dentro de un grupo están lógicamente relacionados y proporcionan acceso a funciones relacionadas del dispositivo.
Los grupos de permisos aparecieron en Android 6.0 Marshmallow junto con el modelo de permisos en tiempo de ejecución. Su objetivo principal es simplificar la interacción con el usuario: en lugar de una serie de diálogos para cada permiso individual, el sistema muestra un diálogo por grupo. Si el usuario concede un permiso de un grupo, el resto se consideran automáticamente aprobados. Según Android UX Research (2015), esto redujo la cantidad de denegaciones en el primer inicio en un 20 por ciento.
Es importante entender que el desarrollador no puede crear sus propios Permission Group. Los grupos están predefinidos a nivel del sistema operativo y se describen en archivos permissions.xml en cada dispositivo. La aplicación solo declara uses-permission, y el sistema asigna automáticamente el permiso a su grupo según protectionLevel y la categorización en AOSP.
La asignación de un permiso a un grupo se produce a través del atributo permissionGroup en la definición del permiso del sistema. Por ejemplo, CAMERA se declara con permissionGroup="android.permission-group.CAMERA", ACCESS_FINE_LOCATION con permissionGroup="android.permission-group.LOCATION". Este mapeo está fijado en el código de Android Open Source Project y es idéntico en todos los dispositivos certificados.
El mecanismo de grupos funciona según el principio de “un diálogo por grupo”. Cuando una aplicación solicita por primera vez un permiso peligroso, el sistema verifica su Permission Group. Si aún no se ha concedido ningún permiso de este grupo, se muestra un diálogo. Después del consentimiento, el sistema marca todo el grupo como concedido, y las solicitudes posteriores de otros permisos del mismo grupo se satisfacen sin interfaz de usuario.
El algoritmo simplificado se ve así:
Este mecanismo solo se aplica a permisos peligrosos. Los permisos normales no tienen grupos y no participan en esta lógica. Los permisos privilegiados y de firma tampoco se agrupan — tienen un sistema de control de acceso separado.
Los grupos no funcionan “en reversa”: revocar un permiso de un grupo a través de la configuración revoca solo ese permiso sin afectar a los demás. Además, si un usuario rechaza el diálogo de un grupo, esto no bloquea otros grupos — cada nuevo permiso de un grupo diferente mostrará su propio diálogo. Permission Group solo afecta la UX de la solicitud, no el modelo de seguridad.
Android define los siguientes Permission Group del sistema para permisos peligrosos. Cada grupo incluye uno o más permisos unidos por un propósito funcional común.
| Identificador del Grupo | Permisos en el Grupo | Descripción |
|---|---|---|
| CAMERA | CAMERA | Acceso a la cámara del dispositivo |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION | Geolocalización (precisa y aproximada) |
| MICROPHONE | RECORD_AUDIO | Grabación de audio a través del micrófono |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP | Funciones telefónicas |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | Acceso a contactos y cuentas |
| SMS | READ_SMS, SEND_SMS, RECEIVE_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS | Envío y recepción de SMS |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE | Lectura y escritura en almacenamiento externo |
| CALENDAR | READ_CALENDAR, WRITE_CALENDAR | Acceso al calendario |
| SENSORS | BODY_SENSORS | Sensores corporales (frecuencia cardíaca y otros) |
| ACTIVITY_RECOGNITION | ACTIVITY_RECOGNITION | Reconocimiento de actividad física |
En Android 13 (API 33), apareció un nuevo grupo NEARBY_DEVICES, que combina BLUETOOTH_SCAN, BLUETOOTH_CONNECT y BLUETOOTH_ADVERTISE. Además, el grupo STORAGE fue reemplazado parcialmente por permisos multimedia READ_MEDIA_IMAGES, READ_MEDIA_VIDEO y READ_MEDIA_AUDIO, que no forman parte de STORAGE sino que son permisos peligrosos independientes sin agrupación.
Los desarrolladores pueden declarar sus propios permisos con Permission Group personalizados a través del atributo permissionGroup en el manifiesto. Sin embargo, esto solo funciona para permisos personalizados de la misma aplicación y no afecta los diálogos de UI del sistema. En la práctica, los Permission Group personalizados se usan raramente — para la interacción entre aplicaciones en el mismo stack.
El impacto de Permission Group en la experiencia del usuario es significativo. Gracias a la agrupación, el usuario no ve 8 diálogos separados para diferentes permisos, sino unos pocos diálogos de grupo. Esto reduce la carga cognitiva y disminuye la probabilidad de que el usuario deniegue un permiso críticamente importante sin entender su propósito.
Las investigaciones de UX muestran que los diálogos grupales son percibidos por los usuarios como más transparentes. Cuando una aplicación solicita “permiso para acceder a la cámara”, el usuario entiende el contexto. Si cada permiso se solicitara por separado — CAMERA, CAMERA2, FLASHLIGHT — crearía una impresión de redundancia. Permission Group abstrae esta granularidad.
La mejor práctica es solicitar permisos solo de un grupo a la vez. Si una aplicación necesita tanto la cámara como la geolocalización, no se deben solicitar en una sola llamada requestPermissions. Primero solicite un grupo después de explicar por qué es necesario, luego el segundo. Esto le da al usuario control y una comprensión secuencial de cada funcionalidad.
Permission Group y ProtectionLevel son dos dimensiones diferentes del sistema de permisos de Android. ProtectionLevel determina cómo se concede un permiso (normal, dangerous, signature, privileged), mientras que Permission Group es una categoría para la visualización en la UI. Son independientes, pero en la práctica la combinación dangerous + permission group es la más común.
Los permisos del mismo ProtectionLevel pueden pertenecer a diferentes grupos. Por ejemplo, ACCESS_FINE_LOCATION y CAMERA ambos tienen protectionLevel dangerous pero pertenecen a diferentes grupos — LOCATION y CAMERA. Y viceversa, los permisos con nombres similares siempre pertenecen al mismo grupo: ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION ambos en LOCATION.
Los niveles de protección superiores — signature y privileged — no utilizan Permission Groups para la UI. Su concesión se controla a nivel del sistema: signature se otorga a aplicaciones firmadas con el mismo certificado que el sistema, y privileged a aplicaciones en la imagen del sistema. Los grupos para tales permisos existen pero no afectan los diálogos de UX porque estos diálogos simplemente no aparecen.
El desarrollador puede determinar mediante programación el Permission Group de cualquier permiso a través de PackageManager. El método getPermissionInfo devuelve PermissionInfo con un campo group que contiene el identificador de cadena del grupo. Esto es útil para registro, analítica y pantallas de permisos de UI personalizadas.
fun getPermissionGroupName(
permission: String
): String? {
return try {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
info.group
} catch (e: NameNotFoundException) {
null
}
}
fun getPermissionsByGroup(
group: String
): List<String> {
val pm = packageManager
val perms = pm.queryPermissionsByGroup(
group,
PackageManager.GET_META_DATA
)
return perms.map { it.name }
}
El conocimiento de los Permission Groups ayuda a construir la arquitectura de solicitudes. Puede crear una abstracción llamada PermissionGroupProvider que devuelve la lista de permisos para un grupo específico. Esto simplifica las pruebas: en pruebas unitarias, el proveedor devuelve datos simulados sin llamar a PackageManager. En pruebas de instrumentación, devuelve grupos reales del sistema.
La integración de PermissionGroupProvider a través de Dagger Hilt o Koin permite una gestión centralizada del mapeo de permisos a grupos. En el proveedor, puede almacenar en caché el resultado de PackageManager.queryPermissionsByGroup para evitar llamadas repetidas al sistema en cada solicitud. Esto es especialmente importante para pantallas de configuración donde se muestra la lista completa de permisos y su estado.
Al recopilar analítica sobre denegaciones, es útil registrar no solo el nombre del permiso sino también su Permission Group. Esto permite identificar qué áreas funcionales causan la mayor cantidad de denegaciones. Por ejemplo, el grupo LOCATION tradicionalmente tiene el mayor porcentaje de denegaciones — alrededor del 40 por ciento, según las estadísticas de Google Play Console.
La analítica por grupos ayuda a tomar decisiones de producto: si el grupo CONTACTS tiene un alto porcentaje de denegaciones, quizás deba reconsiderarse el momento de la solicitud o agregar un diálogo de justificación. El enfoque basado en grupos para la analítica proporciona una imagen más completa que el análisis de permisos individuales, ya que la cantidad de denegaciones en todo un grupo refleja la actitud general del usuario hacia un área funcional.
Preguntas Frecuentes
Permission Group es un mecanismo que combina permisos peligrosos relacionados funcionalmente en una categoría. Si el usuario ha concedido un permiso de un grupo, los demás se otorgan automáticamente sin un diálogo adicional.
Android estándar tiene alrededor de 10 grupos principales: CAMERA, LOCATION, MICROPHONE, PHONE, CONTACTS, SMS, STORAGE, CALENDAR, SENSORS y ACTIVITY_RECOGNITION. Android 13+ agregó NEARBY_DEVICES.
Sí, a través del atributo permissionGroup en AndroidManifest.xml para permisos personalizados. Sin embargo, esto solo funciona para permisos dentro de la aplicación y no afecta los diálogos de UI del sistema. En la práctica, se usa raramente.
Revocar un permiso de un grupo no revoca los demás. El usuario puede desactivar ACCESS_FINE_LOCATION, pero ACCESS_COARSE_LOCATION permanece activo. Grupo solo afecta la concesión, no la revocación.
Use PackageManager.getPermissionInfo y lea el campo group. El método devuelve un identificador de cadena del grupo, por ejemplo android.permission-group.CAMERA. Si el permiso no tiene grupo, el campo será null.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también