Normal Permission — это категория разрешений в Android, которые система предоставляет автоматически без запроса у пользователя. По данным Android Developer Documentation, 2024, нормальные разрешения имеют ProtectionLevel normal и не требуют runtime-диалога, в отличие от опасных. Они охватывают доступ к интернету, состоянию сети и вибрации, не создавая риска для конфиденциальных данных пользователя.
Главное
Normal Permission — это тип системных разрешений Android с ProtectionLevel normal, предоставляемый приложению автоматически в момент установки. Разработчику не требуется писать код для запроса — достаточно указать разрешение в AndroidManifest.xml. Пользователь не видит диалогов и не может отозвать normal permission отдельно, только удалив приложение целиком.
Система Android классифицирует нормальные разрешения как низкорисковые — они не открывают доступ к личным данным, камере или микрофону. Типичные примеры: доступ к интернету, управление вибрацией, чтение состояния Wi-Fi. По данным Android Security Model (2024), около 40 процентов всех системных разрешений относятся к категории normal.
Важное свойство — нормальные разрешения не отзываются в рантайме через Settings. Если пользователь хочет запретить доступ, единственный способ — удалить приложение. Разработчикам стоит учитывать это при архитектуре, но для пользователей такой подход упрощает взаимодействие: никаких диалогов при первом запуске.
Разделение на нормальные и опасные разрешения появилось в Android 6.0 Marshmallow (API 23). До этой версии все разрешения запрашивались при установке — пользователь видел единый список и принимал или отклонял его целиком. Normal Permission сохранил эту модель для низкорисковых операций, а Dangerous перешёл на runtime-запрос. Это изменение улучшило пользовательский опыт и одновременно повысило безопасность.
Многие системные API Android требуют явного указания нормального разрешения, даже если доступ автоматический. Например, класс ConnectivityManager требует ACCESS_NETWORK_STATE, VibratorService требует VIBRATE, WifiManager требует ACCESS_WIFI_STATE. Без объявления соответствующего uses-permission вызов этих API приведёт к SecurityException.
ProtectionLevel normal — это минимальный уровень защиты в Android Permission System. Разрешения с этим уровнем объявляются в манифесте, и система проверяет декларацию при установке, предоставляя доступ без вмешательства пользователя. Никакие UI-элементы не показываются, никакие колбэки не вызываются.
Механизм проверки работает на уровне PackageManager. При установке APK система сканирует все теги uses-permission, определяет уровень защиты каждого разрешения через сопоставление с системными дефинициями в файлах permissions.xml и для normal-level просто регистрирует доступ. Процесс занимает миллисекунды и не требует взаимодействия с пользовательским интерфейсом.
Алгоритм предоставления выглядит следующим образом:
Пользователь не может отозвать нормальное разрешение через интерфейс. В настройках приложений в секции Permissions отображаются только опасные разрешения. Это контрастирует с iOS, где каждое разрешение требует отдельного подтверждения независимо от уровня чувствительности функции.
Normal и Dangerous Permission — две противоположные категории защиты в Android. Главное отличие — в способе предоставления: нормальные даются автоматически при установке, опасные требуют явного согласия через runtime-диалог. Это различие заложено в архитектуре безопасности Android начиная с версии 6.0 Marshmallow.
Сравнение ключевых характеристик:
| Характеристика | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| Запрос у пользователя | Не требуется | Runtime-диалог обязателен |
| Возможность отзыва | Нет, только удаление приложения | Да, через настройки в любой момент |
| Проверка в коде | Всегда PERMISSION_GRANTED | checkSelfPermission обязателен |
| Примеры | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
Пользователь не видит никаких диалогов при запросе Normal Permission. Если приложению нужен INTERNET — оно получает его молча. Для Dangerous Permission система показывает модальный диалог с описанием запрашиваемого доступа. Пользователь нажимает Allow или Deny, а позже может отозвать разрешение в любой момент через Settings. Это ключевое UX-отличие, определяющее стратегию разработки интерфейса.
Normal следует использовать во всех случаях, когда доступ не касается чувствительных данных. ACCESS_NETWORK_STATE для проверки подключения, VIBRATE для тактильной обратной связи, INTERNET для HTTP-запросов — всё это нормальные разрешения. Применение dangerous уровня там, где достаточно normal, — плохая практика, создающая лишние диалоги и снижающая доверие пользователя к приложению.
Android определяет несколько десятков нормальных разрешений, каждое из которых соответствует определённой системной функции. Все они доступны через константы класса Manifest.permission. Ниже приведён перечень наиболее часто используемых в разработке приложений.
| Константа | Доступ | Описание |
|---|---|---|
| INTERNET | Сеть | Открытие сетевых сокетов для HTTP-запросов |
| ACCESS_NETWORK_STATE | Сеть | Получение информации о состоянии сети |
| ACCESS_WIFI_STATE | Wi-Fi | Чтение информации о Wi-Fi-соединениях |
| VIBRATE | Вибрация | Управление вибромотором устройства |
| BLUETOOTH | Bluetooth | Подключение к Bluetooth-устройствам |
| WAKE_LOCK | Питание | Блокировка перехода процессора в сон |
| SET_ALARM | Будильник | Установка будильника через AlarmManager |
| CHANGE_NETWORK_STATE | Сеть | Изменение состояния сетевого подключения |
Нормальные разрешения не группируются в Permission Group для целей отображения в UI. Группы в Android предназначены для экрана настроек, где показываются только опасные разрешения. Однако логически normal разрешения можно разделить на категории: сетевые (INTERNET, ACCESS_NETWORK_STATE), аппаратные (VIBRATE, WAKE_LOCK), системные (SET_ALARM) и Bluetooth-разрешения.
Некоторые константы из Manifest.permission могут менять уровень защиты на разных версиях Android. Например, BLUETOOTH_CONNECT на Android 12+ стал опасным разрешением с runtime-запросом, хотя в более старых версиях был normal. Разработчикам рекомендуется проверять актуальный protectionLevel для целевого API через документацию.
Разработчик может программно проверить, является ли разрешение нормальным, через PackageManager. Метод getPermissionInfo возвращает PermissionInfo, поле protectionLevel которого содержит флаг PermissionInfo.PROTECTION_NORMAL. Это полезно для динамической обработки и отладки.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Объявление Normal Permission в AndroidManifest.xml — простейшая операция, требующая один тег uses-permission. Дополнительная конфигурация protectionLevel не требуется, так как уровень защиты определяется системной дефиницией, а не манифестом приложения. Разработчик просто указывает полное имя константы.
<!-- 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" />
Система при установке обрабатывает все декларации. Если хотя бы одно из указанных разрешений имеет protectionLevel, отличный от normal, потребуется runtime-запрос. INTERNET — самое популярное нормальное разрешение, присутствующее в большинстве Android-приложений, особенно тех, что выполняют HTTP-запросы или загружают контент из сети.
Полный пример AndroidManifest.xml с нормальными и опасным разрешением демонстрирует разницу: синтаксически теги uses-permission одинаковы, но на этапе выполнения INTERNET и VIBRATE будут предоставлены автоматически, а CAMERA потребует диалога.
<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>
При использовании библиотек — Google Play Services, Firebase, Glide — они могут добавлять собственные uses-permission в итоговый манифест через Manifest Merger. Некоторые из них нормальные (INTERNET для Firebase), другие опасные (ACCESS_FINE_LOCATION для Google Maps). Разработчику стоит проверять итоговый merged manifest в build/outputs/logs/manifest-merger-report.txt перед публикацией.
Normal Permission имеет два принципиальных ограничения: невозможность отзыва пользователем и отсутствие UI для управления. Если пользователь не доверяет приложению, но нормальное разрешение уже выдано автоматически — единственный выход удалить приложение. Это создаёт определённый риск, так как normal разрешения не блокируются стандартными средствами Android.
Дополнительное ограничение проявляется на устройствах с несколькими профилями (Work Profile, Multiple Users). Normal Permission предоставляется сразу для всех профилей — приложение не может ограничить разрешение только одним. В корпоративных сценариях это решается через Managed Configurations.
Невозможно проверить, использует ли приложение Normal Permission в данный момент. Системный метод checkSelfPermission работает только для опасных разрешений. Для normal он всегда возвращает PERMISSION_GRANTED, что не отражает реальную активность. Это стоит учитывать при аудите безопасности и анализе поведения приложения.
Также стоит помнить, что некоторые производители устройств (Xiaomi, Huawei, Samsung) модифицируют стандартное поведение разрешений. На их прошивках Normal Permission может требовать дополнительных разрешений в фирменной оболочке MIUI или EMUI. Разработчикам рекомендуется тестировать работу на реальных устройствах разных вендоров.
Часто задаваемые вопросы
Normal Permission предоставляется автоматически при установке без диалога. Dangerous требует runtime-запроса с явным согласием пользователя и может быть отозван через настройки. Normal использует ProtectionLevel normal, Dangerous — protectionLevel dangerous.
Нет, для нормальных разрешений достаточно объявить uses-permission в AndroidManifest.xml. Код для запроса не требуется — система предоставляет доступ автоматически. Это отличает их от опасных, где нужен ActivityCompat.requestPermissions.
Самые часто используемые: INTERNET (сетевые запросы), ACCESS_NETWORK_STATE (проверка подключения), VIBRATE (тактильная обратная связь) и WAKE_LOCK (удержание процессора). Практически каждое Android-приложение использует минимум INTERNET.
Нет, Normal Permission нельзя отозвать через настройки приложения. Единственный способ прекратить доступ — удалить приложение. Это ключевое отличие от опасных разрешений, которые пользователь может отключить в любой момент.
Используйте PackageManager.getPermissionInfo, передав строковое имя разрешения. Метод возвращает PermissionInfo с полем protectionLevel. Сравните с константами PermissionInfo.PROTECTION_NORMAL или PROTECTION_DANGEROUS для определения категории.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также