Runtime Permission — mechanizm zadania uprawnien w czasie wykonywania aplikacji, wprowadzony w Android 6.0 (API 23). W przeciwienstwie do ustawiania uprawnien podczas instalacji, runtime permissions pozwalaja uzytkownikowi udzielac lub cofac dostep do poufnych danych (kamera, geolokalizacja, kontakty) w dowolnym momencie. Wedlug danych Android Developers (2026), ponad 85% aplikacji w Google Play uzywa co najmniej jednego runtime permission.
Najwazniejsze
Runtime Permission (uprawnienie czasu wykonania) — to model bezpieczenstwa Android, w ktorym aplikacja zada dostepu do poufnych danych w momencie, gdy ta funkcjonalnosc jest rzeczywiscie potrzebna uzytkownikowi. Przed Android 6.0 wszystkie uprawnienia byly udzielane podczas instalacji aplikacji, a uzytkownik nie mogl ich cofnac bez calkowitego usuniecia aplikacji.
Przed Android 6.0 uzytkownik widzial liste wszystkich uprawnien podczas instalacji i mogl albo zaakceptowac wszystkie, albo zrezygnowac z instalacji. Badanie z 2015 roku wykazalo, ze 87% uzytkownikow nie czyta listy uprawnien podczas instalacji. Android 6.0 wprowadzil runtime permissions, dzielac uprawnienia na normal (automatyczne) i dangerous (z zadaniem). Android 11 dodal one-time permissions — automatyczne cofanie po zamknieciu aplikacji. Android 13 wprowadzil Photo Picker i powiadomienia push jako osobne runtime permissions.
iOS uzywa podobnego modelu od wersji iOS 10, gdzie dostep do kamery, mikrofonu i geolokalizacji jest zadany przy pierwszym uzyciu. Jednak iOS nie ma pojecia ”normal permissions” — kazde uprawnienie jest zadane jawnie, a odmowa jest zapisywana do czasu ponownego zadania przez programiste poprzez ustawienia systemowe.
Runtime Permission dziala przez systemowe okno dialogowe wywolywane metoda requestPermissions() (AndroidX — ActivityResultLauncher). System wyswietla standardowe okno dialogowe z wyjasnieniem, a uzytkownik wybiera ”Zezwol” lub ”Zabron”. Po odpowiedzi wywolywane jest callback wyniku, w ktorym aplikacja obsluguje decyzje uzytkownika.
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)
}
}
}
Metoda shouldShowRequestPermissionRationale zwraca true, jesli uzytkownik juz raz odrzucil zadanie. W tym przypadku zaleca sie pokazanie okna dialogowego z wyjasnieniem, dlaczego aplikacja potrzebuje uprawnienia, a dopiero potem ponowne zadanie. Zwieksza to prawdopodobienstwo zgody uzytkownika o 30–40% (dane Google I/O 2024).
Android klasyfikuje wszystkie uprawnienia na kilka poziomow ochrony: normal, dangerous, signature i special. Normal permissions sa udzielane automatycznie podczas instalacji. Dangerous permissions wymagaja zadania runtime. Signature permissions sa dostepne tylko dla aplikacji podpisanych tym samym certyfikatem.
| Grupa | Uprawnienia | 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+ (zmiany w 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) wymagaja dodatkowego przejscia do ustawien systemowych przez Settings.ACTION_MANAGE_OVERLAY_PERMISSION. Te uprawnienia nie moga byc zadane standardowym oknem dialogowym i wymagaja wyraznego przejscia uzytkownika do ekranu ustawien.
Android 12 wprowadzil znaczace zmiany w modelu runtime permissions. One-time permissions pozwalaja udzielic dostepu do kamery, mikrofonu lub geolokalizacji tylko na jedna sesje. Gdy uzytkownik zamknie aplikacje, uprawnienie jest automatycznie cofane. Privacy indicators — zielone wskazniki na pasku stanu pokazujace, kiedy aplikacja uzywa kamery lub mikrofonu.
// Android 12+ — menangani izin satu kali untuk geolokasi
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
)
)
}
// Memeriksa apakah izin telah dicabut oleh sistem (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 dodal uprawnienie POST_NOTIFICATIONS do grupy dangerous, wymagajac wyraznego zadania wysylania powiadomien push. Android 14 wprowadzil ograniczenia dotyczace geolokalizacji w tle: aplikacja musi uzyskac wyrazna zgode uzytkownika za kazdym razem przy zadaniu background location. Photo Picker (API 33+) zastapil potrzebe READ_EXTERNAL_STORAGE do wyboru obrazow.
Odmowa uzytkownika udzielenia uprawnienia — to normalna sytuacja, ktora nalezy poprawnie obsluzyc. Istnieja dwa typy odmowy: jednorazowa (uzytkownik kliknal ”Zabron”) i stala (uzytkownik wybral ”Nie pytaj wiecej”). W drugim przypadku systemowe okno dialogowe nie bedzie juz wyswietlane, a aplikacja musi przekierowac uzytkownika do ustawien systemowych.
Po pierwszej odmowie aplikacja powinna pokazac rationale dialog — wlasne wyjasnienie, dlaczego uprawnienie jest konieczne. Jesli uzytkownik ponownie odmowi, nalezy przekierowac go do ekranu ustawien aplikacji przez Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Material 3 zaleca uzywanie PermissionRequestBottomSheet dla bardziej naturalnego UX.
Wazne, aby nie blokowac calkowicie funkcjonalnosci aplikacji przy odmowie. Na przyklad, jesli uzytkownik odrzucil geolokalizacje, aplikacja powinna zaproponowac reczne wprowadzenie adresu. Dla kamery — umozliwic zaladowanie obrazu z galerii. Google zaleca zawsze zapewniac mechanizm fallback dla wszystkich runtime permissions.
Runtime permissions — to nie tylko mechanizm techniczny, ale takze element zaufania uzytkownika do aplikacji. Źadanie uprawnienia w nieodpowiednim momencie (na przyklad przy pierwszym uruchomieniu) znaczaco zmniejsza prawdopodobienstwo zgody. Google Play Store analizuje czestotliwosc i kontekst zadan uprawnien: aplikacje z agresywnymi zadaniami otrzymuja nizsze pozycje w wyszukiwaniu.
Kontekst — zadaj uprawnienia bezposrednio przed wykonaniem dzialania, ktore go wymaga. Minimum — zadaj tylko tych uprawnien, ktore sa rzeczywiscie niezbedne do dzialania funkcji. Przejrzystosc — wyjasnij uzytkownikowi, dlaczego uprawnienie jest potrzebne, przed systemowym oknem dialogowym. Cofniecie — subskrybuj ACTION_PERMISSION_REVOCATION do poprawnej obslugi cofniecia uprawnienia w czasie wykonania.
Do testowania runtime permissions uzywaj polecen adb: adb shell pm revoke <package> android.permission.CAMERA pozwala symulowac cofniecie uprawnienia bez ponownej instalacji aplikacji. Espresso i UiAutomator obsluguja testowanie okien dialogowych uprawnien przez GrantPermissionRule. Integracja tych narzedzi w pipeline CI/CD jest obowiazkowa dla aplikacji z runtime permissions.
Google Play Console udostepnia sekcje Permission auditing (audyt uprawnien), gdzie programista widzi, jak czesto zadane sa uprawnienia, jaki procent uzytkownikow udziela dostepu i ktore uprawnienia zostaly cofniete. Analiza tych danych pomaga zidentyfikowac nieefektywne zadania i zoptymalizowac UX. Na przyklad, jesli mniej niz 40% uzytkownikow udziela geolokalizacji, warto przeanalizowac timing zadania i dodac bardziej przekonujace uzasadnienie.
Uzywanie Android Vitals do monitorowania permission-related ANR (Application Not Responding) jest rowniez kluczowe. Jesli zadanie uprawnienia wykonuje sie na glownym watku lub systemowe okno dialogowe blokuje UI, moze to spowodowac ANR na wolnych urzadzeniach. Przenies sprawdzanie i zadanie uprawnien do osobnego watku lub uzyj korutyn Kotlin do asynchronicznego przetwarzania, aby uniknac blokowania interfejsu uzytkownika.
Czesto zadawane pytania
shouldShowRequestPermissionRationale zwraca false przy stalej odmowie (gdy uzytkownik wybral ”Nie pytaj wiecej”). Metoda zwraca true przy jednorazowej odmowie, pozwalajac pokazac rationale dialog. Jesli metoda zwrocila false, jedynym wyjsciem jest przekierowanie uzytkownika do ustawien systemowych aplikacji.
Tak, ActivityResultContracts.RequestMultiplePermissions pozwala zadac tablicy uprawnien w jednym wywolaniu. System wyswietli kolejno okna dialogowe dla kazdego uprawnienia. Zaleca sie grupowanie logicznie powiazanych uprawnien (na przyklad CAMERA i RECORD_AUDIO do nagrywania wideo), ale nie zadac wiecej niz 2–3 na raz.
Android TV uzywa tego samego modelu runtime permissions z wyswietlaniem okien dialogowych na ekranie telewizora. Wear OS w wersji 3+ obsluguje runtime permissions, ale okna dialogowe wyswietlane sa na zegarku. Dla Android Auto wszystkie uprawnienia sa zadane na telefonie, a system samochodowy otrzymuje juz zatwierdzone uprawnienia przez polaczenie bridge.
Wedlug wstepnych informacji Android 16 wprowadza ”permission expiration” dla uprawnien jednorazowych z automatycznym cofnieciem po 24 godzinach. Oczekuje sie rowniez zaostrzenia wymagan dotyczacych background location i rozszerzenia listy dangerous permissions o nowe kategorie (czujniki otoczenia, skanowanie Wi-Fi). Dokladne szczegoly pojawia sie w Q3 2027.
iOS nie obsluguje ”normal permissions” — kazde uprawnienie jest zadane jawnie przez systemowe okno dialogowe. Uzytkownik moze cofnac uprawnienie w dowolnym momencie przez ustawienia. Glowna roznica — iOS nie sprawdza wstepnie statusu uprawnienia przez analog checkSelfPermission: system automatycznie wyswietla okno dialogowe przy pierwszym uzyciu chronionego API.
Podsumowanie
POST_NOTIFICATIONS jako runtime permission, Android 14 zaostrzyl wymagania dotyczace geolokalizacji w tle.READ_EXTERNAL_STORAGE do wyboru obrazow.Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga