Runtime Permission: kahulugan, mga uri at prinsipyo ng paggana sa Android

May-akda: IT Sectr Nai-publish: 2026-05-20 Oras ng pagbabasa: 8 min

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 — mechanizm Android wymagajacy wyraznej zgody uzytkownika na dostep do poufnych danych.
  • Dangerous permissions — grupa uprawnien wymagajacych zadania runtime (kamera, mikrofon, geolokalizacja, kontakty).
  • Normal permissions — automatycznie zatwierdzane przez system i nie wymagaja zadania runtime (INTERNET, ACCESS_NETWORK_STATE).
  • One-time permissions — uprawnienia na jedna sesje, wprowadzone w Android 11, automatycznie cofane po zamknieciu aplikacji.
  • shouldShowRequestPermissionRationale — flaga wskazujaca, czy nalezy pokazac uzytkownikowi wyjasnienie przed zadaniem.

Co to jest Runtime Permission?

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.

Ewolucja modelu uprawnien Android

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.

Jak dziala Runtime Permission w Androidzie?

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.

Źadanie uprawnienia przez ActivityResultLauncher

kotlin
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).

Rodzaje uprawnien w Androidzie

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.

Grupy niebezpiecznych uprawnien

GrupaUprawnieniaAPI Level
CAMERACAMERAAPI 23+
LOCATIONACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATIONAPI 23+ (background — API 29+)
STORAGEREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+)API 23+ (zmiany w API 33)
PHONEREAD_PHONE_STATE, CALL_PHONE, READ_CALL_LOGAPI 23+
MICROPHONERECORD_AUDIOAPI 23+
CONTACTSREAD_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTSAPI 23+
NOTIFICATIONSPOST_NOTIFICATIONSAPI 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.

Źadanie uprawnien w Android 12+

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.

Obsluga uprawnien jednorazowych

kotlin
// Android 12+ — paghawak ng isang beses na pahintulot para sa geolokasyon
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
        )
    )
}

// Pagsusuri kung ang pahintulot ay binawi ng system (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.

Obsluga odmow uzytkownika

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.

Strategia obslugi odmow

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.

Zalecenia dotyczace bezpieczenstwa

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.

Zasady zadania uprawnien

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.

Audyt uprawnien w Google Play Console

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

Jak odroznic jednorazowa odmowe od stalej?

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.

Czy mozna zadac kilku uprawnien jednoczesnie?

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.

Jak runtime permissions dzialaja na Android TV i Wear OS?

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.

Jakie zmiany w permissions sa oczekiwane w Android 16?

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.

Czym rozni sie runtime permission na Androidzie od iOS?

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

  • Runtime Permission — mechanizm zadania poufnych danych w momencie ich faktycznego uzycia, wprowadzony w Android 6.0.
  • Dangerous permissions wymagaja jawnego systemowego okna dialogowego, normal permissions sa zatwierdzane automatycznie.
  • One-time permissions (Android 12+) sa cofane przy zamknieciu aplikacji, zwiekszajac prywatnosc uzytkownika.
  • shouldShowRequestPermissionRationale okresla, czy byla poprzednia odmowa i pomaga wybrac strategie zadania.
  • Android 13 dodal POST_NOTIFICATIONS jako runtime permission, Android 14 zaostrzyl wymagania dotyczace geolokalizacji w tle.
  • Photo Picker (API 33+) zastepuje potrzebe READ_EXTERNAL_STORAGE do wyboru obrazow.
  • Zawsze zapewniaj fallback przy odmowie uzytkownika — alternatywny sposob wprowadzania danych lub reczny wybor.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din