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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також