Normal Permission es una categoría de permisos en Android que el sistema concede automáticamente sin preguntar al usuario. Según Android Developer Documentation, 2024, los permisos normales tienen ProtectionLevel normal y no requieren un diálogo en tiempo de ejecución, a diferencia de los peligrosos. Cubren el acceso a internet, el estado de la red y la vibración, sin crear riesgos para los datos confidenciales del usuario.
Puntos clave
Normal Permission es un tipo de permiso del sistema en Android con ProtectionLevel normal, que se concede a una aplicación automáticamente en el momento de la instalación. El desarrollador no necesita escribir código para solicitarlo — basta con declarar el permiso en AndroidManifest.xml. El usuario no ve ningún diálogo y no puede revocar un permiso normal por separado, solo desinstalando toda la aplicación.
El sistema Android clasifica los permisos normales como de bajo riesgo — no otorgan acceso a datos personales, cámara o micrófono. Ejemplos típicos: acceso a internet, control de vibración, lectura del estado del Wi-Fi. Según Android Security Model (2024), alrededor del 40 por ciento de todos los permisos del sistema pertenecen a la categoría normal.
Una propiedad importante — los permisos normales no se pueden revocar en tiempo de ejecución a través de Ajustes. Si el usuario quiere denegar el acceso, la única forma es desinstalar la aplicación. Los desarrolladores deben considerar esto en la arquitectura, pero para los usuarios este enfoque simplifica la interacción: sin diálogos al primer inicio.
La división en permisos normales y peligrosos apareció en Android 6.0 Marshmallow (API 23). Antes de esta versión, todos los permisos se solicitaban al instalar — el usuario veía una lista única y la aceptaba o rechazaba en su totalidad. Normal Permission mantuvo este modelo para operaciones de bajo riesgo, mientras que Dangerous pasó a la solicitud en tiempo de ejecución. Este cambio mejoró la experiencia del usuario y al mismo tiempo aumentó la seguridad.
Muchas API del sistema Android requieren una declaración explícita de un permiso normal, incluso si el acceso es automático. Por ejemplo, la clase ConnectivityManager requiere ACCESS_NETWORK_STATE, VibratorService requiere VIBRATE, WifiManager requiere ACCESS_WIFI_STATE. Sin declarar el correspondiente uses-permission, la llamada a estas API provocará una SecurityException.
ProtectionLevel normal es el nivel mínimo de protección en el sistema de permisos de Android. Los permisos con este nivel se declaran en el manifiesto, y el sistema verifica la declaración al instalar, concediendo el acceso sin intervención del usuario. No se muestran elementos de la interfaz de usuario, no se invoca ninguna devolución de llamada.
El mecanismo de verificación funciona a nivel de PackageManager. Durante la instalación del APK, el sistema escanea todas las etiquetas uses-permission, determina el nivel de protección de cada permiso cotejándolo con las definiciones del sistema en los archivos permissions.xml, y para el nivel normal simplemente registra el acceso. El proceso dura milisegundos y no requiere interacción con la interfaz de usuario.
El algoritmo de concesión funciona de la siguiente manera:
El usuario no puede revocar un permiso normal a través de la interfaz. En la configuración de las aplicaciones, en la sección de Permisos, solo se muestran los permisos peligrosos. Esto contrasta con iOS, donde cada permiso requiere una confirmación independiente, independientemente del nivel de sensibilidad de la función.
Normal y Dangerous Permission son dos categorías opuestas de protección en Android. La principal diferencia está en la forma de concesión: los normales se otorgan automáticamente al instalar, los peligrosos requieren un consentimiento explícito mediante un diálogo en tiempo de ejecución. Esta distinción está integrada en la arquitectura de seguridad de Android desde la versión 6.0 Marshmallow.
Comparación de las características clave:
| Característica | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| Solicitud al usuario | No se requiere | Diálogo en tiempo de ejecución obligatorio |
| Posibilidad de revocación | No, solo desinstalando la aplicación | Sí, a través de ajustes en cualquier momento |
| Verificación en código | Siempre PERMISSION_GRANTED | checkSelfPermission obligatorio |
| Ejemplos | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
El usuario no ve ningún diálogo al solicitar Normal Permission. Si una aplicación necesita INTERNET — lo obtiene silenciosamente. Para Dangerous Permission, el sistema muestra un diálogo modal con la descripción del acceso solicitado. El usuario pulsa Permitir o Denegar, y luego puede revocar el permiso en cualquier momento a través de Ajustes. Esta es una diferencia clave de UX que determina la estrategia de desarrollo de la interfaz.
Normal debe utilizarse en todos los casos en que el acceso no implique datos confidenciales. ACCESS_NETWORK_STATE para comprobar la conectividad, VIBRATE para la retroalimentación háptica, INTERNET para peticiones HTTP — todos estos son permisos normales. Usar el nivel dangerous donde el normal es suficiente es una mala práctica, que crea diálogos innecesarios y reduce la confianza del usuario en la aplicación.
Android define varias decenas de permisos normales, cada uno correspondiente a una función del sistema específica. Todos están disponibles a través de las constantes de la clase Manifest.permission. A continuación se muestra una lista de los más utilizados en el desarrollo de aplicaciones.
| Constante | Acceso | Descripción |
|---|---|---|
| INTERNET | Red | Apertura de sockets de red para peticiones HTTP |
| ACCESS_NETWORK_STATE | Red | Obtención de información sobre el estado de la red |
| ACCESS_WIFI_STATE | Wi-Fi | Lectura de información sobre conexiones Wi-Fi |
| VIBRATE | Vibración | Control del vibrador del dispositivo |
| BLUETOOTH | Bluetooth | Conexión a dispositivos Bluetooth |
| WAKE_LOCK | Alimentación | Bloqueo de la suspensión del procesador |
| SET_ALARM | Alarma | Configuración de alarma mediante AlarmManager |
| CHANGE_NETWORK_STATE | Red | Cambio del estado de la conexión de red |
Los permisos normales no se agrupan en Permission Groups para su visualización en la interfaz de usuario. Los grupos en Android están destinados a la pantalla de configuración, donde solo se muestran los permisos peligrosos. Sin embargo, los permisos normales se pueden dividir lógicamente en categorías: red (INTERNET, ACCESS_NETWORK_STATE), hardware (VIBRATE, WAKE_LOCK), sistema (SET_ALARM) y permisos Bluetooth.
Algunas constantes de Manifest.permission pueden cambiar su nivel de protección en diferentes versiones de Android. Por ejemplo, BLUETOOTH_CONNECT en Android 12+ se convirtió en un permiso peligroso con solicitud en tiempo de ejecución, aunque en versiones anteriores era normal. Se recomienda a los desarrolladores comprobar el protectionLevel actual para la API objetivo a través de la documentación.
Un desarrollador puede comprobar mediante programación si un permiso es normal a través de PackageManager. El método getPermissionInfo devuelve PermissionInfo cuyo campo protectionLevel contiene el indicador PermissionInfo.PROTECTION_NORMAL. Esto es útil para el manejo dinámico y la depuración.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Declarar Normal Permission en AndroidManifest.xml es la operación más sencilla, que requiere una sola etiqueta uses-permission. No se necesita configuración adicional de protectionLevel, ya que el nivel de protección lo determina la definición del sistema, no el manifiesto de la aplicación. El desarrollador simplemente especifica el nombre completo de la constante.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
El sistema procesa todas las declaraciones al instalarse. Si al menos uno de los permisos declarados tiene un protectionLevel diferente de normal, se requerirá una solicitud en tiempo de ejecución. INTERNET es el permiso normal más popular, presente en la mayoría de las aplicaciones de Android, especialmente las que realizan peticiones HTTP o cargan contenido de la red.
Un ejemplo completo de AndroidManifest.xml con permisos normales y peligrosos demuestra la diferencia: sintácticamente las etiquetas uses-permission son iguales, pero en tiempo de ejecución INTERNET y VIBRATE se concederán automáticamente, mientras que CAMERA requerirá un diálogo.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
Al usar bibliotecas — Google Play Services, Firebase, Glide — estas pueden añadir sus propios uses-permission al manifiesto final a través de Manifest Merger. Algunos son normales (INTERNET para Firebase), otros peligrosos (ACCESS_FINE_LOCATION para Google Maps). El desarrollador debe comprobar el manifiesto fusionado final en build/outputs/logs/manifest-merger-report.txt antes de la publicación.
Normal Permission tiene dos limitaciones fundamentales: la imposibilidad de revocarlo por parte del usuario y la ausencia de una interfaz de gestión. Si el usuario no confía en la aplicación pero el permiso normal ya se ha concedido automáticamente — la única solución es desinstalar la aplicación. Esto crea un cierto riesgo, ya que los permisos normales no se pueden bloquear con los medios estándar de Android.
Una limitación adicional aparece en dispositivos con múltiples perfiles (Work Profile, Multiple Users). Normal Permission se concede a todos los perfiles a la vez — la aplicación no puede restringir el permiso a solo uno. En escenarios empresariales esto se resuelve mediante Managed Configurations.
No es posible comprobar si una aplicación está usando un Normal Permission en un momento dado. El método del sistema checkSelfPermission solo funciona para permisos peligrosos. Para los normales siempre devuelve PERMISSION_GRANTED, lo que no refleja la actividad real. Esto debe tenerse en cuenta durante las auditorías de seguridad y el análisis del comportamiento de la aplicación.
También vale la pena recordar que algunos fabricantes de dispositivos (Xiaomi, Huawei, Samsung) modifican el comportamiento estándar de los permisos. En sus firmwares, Normal Permission puede requerir permisos adicionales en el shell propietario MIUI o EMUI. Se recomienda a los desarrolladores probar en dispositivos reales de diferentes fabricantes.
Preguntas frecuentes
Normal Permission se concede automáticamente al instalar sin diálogo. Dangerous requiere una solicitud en tiempo de ejecución con el consentimiento explícito del usuario y puede revocarse a través de ajustes. Normal usa ProtectionLevel normal, Dangerous usa protectionLevel dangerous.
No, para los permisos normales basta con declarar uses-permission en AndroidManifest.xml. No se requiere código de solicitud — el sistema concede el acceso automáticamente. Esto los diferencia de los peligrosos, donde se necesita ActivityCompat.requestPermissions.
Los más utilizados son: INTERNET (peticiones de red), ACCESS_NETWORK_STATE (comprobación de conectividad), VIBRATE (retroalimentación háptica) y WAKE_LOCK (mantener el procesador activo). Prácticamente todas las aplicaciones de Android usan al menos INTERNET.
No, Normal Permission no se puede revocar a través de la configuración de la aplicación. La única forma de detener el acceso es desinstalar la aplicación. Esta es una diferencia clave con los permisos peligrosos, que el usuario puede desactivar en cualquier momento.
Use PackageManager.getPermissionInfo pasando el nombre del permiso como cadena. El método devuelve PermissionInfo con un campo protectionLevel. Compárelo con las constantes PermissionInfo.PROTECTION_NORMAL o PROTECTION_DANGEROUS para determinar la categoría.
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