Runtime Permission — механизам захтева дозвола током извршавања апликације, уведен у Android 6.0 (API 23). За разлику од постављања дозвола при инсталацији, runtime permissions омогућују кориснику да у сваком тренутку одобри или опозове приступ поверљивим подацима (камера, геолокација, контакти). Према Android Developers (2026), више од 85% апликација у Google Play-у користи бар једну runtime permission.
Главно
Runtime Permission (дозвола у тренутку извршавања) — је Android модел безбедности у коме апликација захтева приступ поверљивим подацима у тренутку када је та функционалност стварно потребна кориснику. Пре Android 6.0, сва дозволе су се одобравала при инсталацији апликације, и корисник није могао да их опозове без потпуног уклањања апликације.
Пре Android 6.0, корисник је видео листу свих дозвола при инсталацији и могао или да прихвати све, или да одустане од инсталације. Истраживање из 2015. године је показало да 87% корисника не чита листу дозвола при инсталацији. Android 6.0 је увео runtime permissions, поделивши дозволе на normal (аутоматске) и dangerous (са захтевом). Android 11 је додао one-time permissions — аутоматско повлачење након затварања апликације. Android 13 је увео Photo Picker и push обавештења као засебне runtime permissions.
iOS користи сличан модел од верзије iOS 10, где се приступ камери, микрофону и геолокацији захтева при првом кориштењу. Међутим, iOS нема концепт „normal permissions“ — свака дозвола се захтевају експлицитно, а одбијање се чува до поновног захтева од стране програмера кроз системска подешавања.
Runtime Permission ради кроз системски дијалог који се позива методом requestPermissions() (AndroidX — ActivityResultLauncher). Систем приказује стандардни дијалог са објашњењем, а корисник бира „Дозволи“ или „Одбији“. Након одговора, позива се callback резултата у коме апликација обрађује одлуку корисника.
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
startCamera()
} else {
showPermissionDeniedDialog()
}
}
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED -> {
startCamera()
}
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) -> {
showRationaleDialog { requestPermissionLauncher.launch(Manifest.permission.CAMERA) }
}
else -> {
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}
}
Метода shouldShowRequestPermissionRationale враћа true ако је корисник већ једном одбио захтев. У овом случају се препоручује приказивање дијалога са објашњењем зашто је апликацији потребно дозволење, и тек онда поново захтевати. Ово повећава вероватноћу прихватања за 30–40% (подаци Google I/O 2024).
Android класификује сва дозволе на неколико нивоа заштите: normal, dangerous, signature и special. Normal permissions се додељују аутоматски при инсталацији. Dangerous permissions захтевају runtime захтев. Signature permissions су доступне само апликацијама потписаним истим цертификатом.
| Група | Дозволе | API Level |
|---|---|---|
| CAMERA | CAMERA | API 23+ |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATION | API 23+ (background — API 29+) |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+) | API 23+ (измене API 33) |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG | API 23+ |
| MICROPHONE | RECORD_AUDIO | API 23+ |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | API 23+ |
| NOTIFICATIONS | POST_NOTIFICATIONS | API 33+ |
Special permissions (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, MANAGE_EXTERNAL_STORAGE) захтевају додатни прелазак на системска подешавања кроз Settings.ACTION_MANAGE_OVERLAY_PERMISSION. Ове дозволе не могу бити захтеване стандардним системским дијалогом и захтевају експлицитан прелазак корисника на екран подешавања.
Android 12 је представио значајне промјене у моделу runtime permissions. One-time permissions омогућују додјељивање приступа камери, микрофону или геолокацији само за једну сесију. Када корисник затвори апликацију, дозвола се аутоматски повлачи. Privacy indicators — зелени индикатори у траки статуса који показују када апликација користи камеру или микрофон.
// Android 12+ — обрада једнократне дозволе за геолокацију
private fun checkLocationPermission() {
val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
val fineLocationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION]
val coarseLocationGranted = permissions[Manifest.permission.ACCESS_COARSE_LOCATION]
if (fineLocationGranted == true) {
showUserLocation()
} else {
showLocationDisabledDialog()
}
}
permissionLauncher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}
// Провера да ли је дозвола повучена од стране система (Android 12+)
class PermissionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_PERMISSION_REVOCATION) {
handleRevokedPermission(intent.getStringExtra(Intent.EXTRA_REVOKED_PERMISSION))
}
}
}
Android 13 је додао дозволу POST_NOTIFICATIONS у dangerous групу, захтевајући експлицитан захтев за слање push обавештења. Android 14 је увео ограничења за позадинску геолокацију: апликација мора да добије експлицитну сагласност корисника сваки пут када захтева background location. Photo Picker (API 33+) је заменио потребу за READ_EXTERNAL_STORAGE за избор слика.
Одбијање корисника да дозволи је нормална ситуација коју треба правилно обрадити. Постоје две врсте одбијања: једнократно (корисник је кликнуо „Одбији“) и трајно (корисник је изабрао „Не питај више“). У другом случају, системски дијалог се више не ће приказивати, и апликација мора да преусмери корисника на системска подешавања.
Након првог одбијања, апликација треба да прикаже rationale dialog — сопствено објашњење зашто је дозвола потребно. Ако корисник поново одбије, треба га преусмерити на екран подешавања апликације кроз Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Material 3 препоручује коришћење PermissionRequestBottomSheet за природнији UX.
Важно је не блокирати потпуно функционалност апликације при одбијању. На примјер, ако је корисник одбио геолокацију, апликација треба да понуди речно уношење адресе. За камеру — да омогући учитавање слике из галерије. Google препоручује увијек обезбједити fallback механизам за све runtime permissions.
Runtime permissions нису само технички механизам, већ и елемент поверења корисника у апликацију. Захтев дозволе у неповољном тренутку (на примјер, при првом покретању) значајно смањује вероватноћу прихватања. Google Play Store анализира учесталост и контекст захтева дозвола: апликације са агресивним захтевима добијају ниже позиције у претраживању.
Контекст — захтевајте дозволу непосредно пре извршавања радње која је захтева. Минимум — захтевајте само оне дозволе које су стварно потребне за рад функције. Транспарентност — објасните кориснику зашто је потребно дозволење пре системског дијалога. Повлачење — претплатите се на ACTION_PERMISSION_REVOCATION за правилну обраду повлачења дозволе у радном времену.
За тестирање runtime permissions користите adb команде: adb shell pm revoke <package> android.permission.CAMERA омогућава симулацију повлачења дозволе без поновне инсталације апликације. Espresso и UiAutomator подржавају тестирање дијалога дозвола кроз GrantPermissionRule. Интеграција ових алата у CI/CD пиплајн је обавезна за апликације са runtime permissions.
Google Play Console пружа секцију Permission auditing (аудит дозвола), где програмер види колико често се захтевају дозволе, колики проценат корисника одобрава приступ и које су дозволе повучене. Анализа ових података помаже да се идентификују неефикасни захтеви и оптимизује UX. На примјер, ако мање од 40% корисника одобрава геолокацију, вреди преиспитати тајминг захтева и додати уверљивијије образложење.
Коришћење Android Vitals за праћење permission-related ANR (апликација не реагује) је такође критично. Ако се захтев дозволе извршава на главном протоку или системски дијалог блокира UI, то може изазвати ANR на спорим уређајима. Пребаците провјеру и захтев дозвола на посебан проток или користите Kotlin корутине за асинхроно процесирање да бисте избегли блокирања корисничког интерфејса.
Често постављана питања
shouldShowRequestPermissionRationale враћа false код трајног одбијања (када је корисник изабрао „Не питај више“). Метода враћа true код једнократног одбијања, омогућавајући приказивање rationale дијалога. Ако је метода вратила false, једини излаз је преусмерање корисника на системска подешавања апликације.
Да, ActivityResultContracts.RequestMultiplePermissions омогућава захтев низа дозвола у једном позиву. Систем ће приказати узастопно дијалоге за сваку дозволу. Препоручује се груписање логички повезаних дозвола (на примјер, CAMERA и RECORD_AUDIO за видео снимање), али не захтевати више од 2–3 одједном.
Android TV користи исти модел runtime permissions са приказивањем дијалога на телевизорском екрану. Wear OS верзија 3+ подржава runtime permissions, али се дијалози приказују на сату. За Android Auto, сва дозволе се захтевају на телефону, а аутомобилски систем добија одобрене дозволе кроз bridge везу.
Према прелиминарним информацијама, Android 16 уводи „истек дозволе“ за једнократне дозволе са аутоматским повлачењем након 24 сата. Такође се очекује заоштрење захтева за background location и проширење листе dangerous permissions за нове категорије (сензори околине, Wi-Fi скенирање). Детаљи ће бити познати у Q3 2027.
iOS не подржава „normal permissions“ — свака дозвола се захтева експлицитно кроз системски дијалог. Корисник може да повуче дозволу у сваком тренутку кроз подешавања. Главна разлика — iOS не проверава статус дозволе унапред путем аналога checkSelfPermission: систем аутоматски приказује дијалог при првом кориштењу заштићеног API-ја.
Закључак
POST_NOTIFICATIONS као runtime permission, Android 14 је пооштрио захтеве за позадинску геолокацију.READ_EXTERNAL_STORAGE за избор слика.Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође