Normal Permission — категорија дозвола у Android-у које систем одобрава аутоматски без питања корисника. Према Android Developer Documentation, 2024, нормалне дозволе имају ProtectionLevel normal и не захтевају runtime дијалог, за разлику од опасних. Оне обухватају приступ интернету, стању мреже и вибрацији, не стварајући ризик за поверљиве податке корисника.
Главно
Normal Permission — тип системских Android дозвола са ProtectionLevel normal, који се аутоматски одобрава апликацији у тренутку инсталације. Програмер не мора да пише код за захтев — довољно је навести дозволу у AndroidManifest.xml. Корисник не види дијалоге и не може да опозове normal permission посебно, само брисањем целе апликације.
Android систем класификује нормалне дозволе као нискоризичне — one не отварају приступ личним подацима, камери или микрофону. Типични примери: приступ интернету, управљање вибрацијом, читање стања Wi-Fi-ја. Према Android Security Model (2024), око 40 процената свих системских дозвола припада категорији normal.
Важно својство — нормалне дозволе се не опозивају у runtime-у кроз Settings. Ако корисник жели да забрани приступ, једини начин је брисање апликације. Програмери треба да узму ово у обзир при архитектури, али за кориснике овакав приступ поједностављује интеракцију: без дијалога при првом покретању.
Подела на нормалне и опасне дозволе појавила се у Android 6.0 Marshmallow (API 23). До ове верзије, све дозволе су захтеване при инсталацији — корисник је видео јединствену листу и прихватао или одбијао у целини. Normal Permission је задржао овај модел за нискоризичне операције, а Dangerous је прешао на runtime захтев. Ова промена је побољшала корисничко искуство и истовремено повећала безбедност.
Многи системски Android API-ји захтевају експлицитно навођење нормалне дозволе, чак и ако је приступ аутоматски. На пример, класа ConnectivityManager захтева ACCESS_NETWORK_STATE, VibratorService захтева VIBRATE, WifiManager захтева ACCESS_WIFI_STATE. Без декларације одговарајућег uses-permission, позив ових API-ја ће довести до SecurityException.
ProtectionLevel normal — минимални ниво заштите у Android Permission System-у. Дозволе са овим нивоом се декларишу у манифесту, а систем проверава декларацију при инсталацији, одобравајући приступ без интервенције корисника. Ниједан UI елемент се не приказује, ниједан callback се не позива.
Механизам провере ради на нивоу PackageManager-а. При инсталацији APK-а, систем скенира све uses-permission тагове, одређује ниво заштите сваке дозволе кроз поређење са системским дефиницијама у датотекама permissions.xml и за normal-level једноставно региструје приступ. Процес траје милисекунде и не захтева интеракцију са корисничким интерфејсом.
Алгоритам одобравања изгледа овако:
Корисник не може да опозове нормалну дозволу кроз интерфејс. У подешавањима апликације у секцији Дозволе приказују се само опасне дозволе. Ово је у контрасту са 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 | Мрежа | Отварање мрежних socket-а за 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-у су намењене екрану подешавања, где се приказују само опасне дозволе. Међутим, логички се нормалне дозволе могу поделити у категорије: мрежне (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). Програмер треба да провери коначни спојени манифест у build/outputs/logs/manifest-merger-report.txt пре објављивања.
Normal Permission има два основна ограничења: немогућност опозива од стране корисника и одсуство UI-ја за управљање. Ако корисник не верује апликацији, али је нормална дозвола већ аутоматски издата — једини излаз је брисање апликације. Ово ствара одређени ризик, јер нормалне дозволе нису блокиране стандардним 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође