Permission Group je mechanismus seskupování oprávnění v Androidu, který kombinuje funkčně související nebezpečná oprávnění do jedné logické kategorie. Podle Android Permissions Overview, 2024, skupiny oprávnění zjednodušují uživatelské rozhraní: pokud uživatel udělil jedno oprávnění ze skupiny, ostatní jsou automaticky udělena bez dalších dialogů. To snižuje počet žádostí a zlepšuje UX.
Hlavní body
Permission Group — je systémový mechanismus Androidu, který kombinuje několik nebezpečných oprávnění do jedné skupiny na základě jejich funkčního účelu. Každá skupina má řetězcový identifikátor, například android.permission-group.CAMERA nebo android.permission-group.LOCATION. Všechna oprávnění v rámci jedné skupiny jsou logicky propojena a poskytují přístup k příbuzným funkcím zařízení.
Skupiny oprávnění se objevily v Android 6.0 Marshmallow spolu s modelem žádostí za běhu. Jejich hlavním účelem je zjednodušit interakci s uživatelem: místo série dialogů pro každé jednotlivé oprávnění systém zobrazuje jeden dialog na skupinu. Pokud uživatel udělil jedno oprávnění ze skupiny, ostatní jsou považovány za automaticky schválené. Podle Android UX Research (2015) to snížilo počet odmítnutí při prvním spuštění o 20 procent.
Je důležité pochopit, že vývojář nemůže vytvářet vlastní Permission Group. Skupiny jsou předdefinovány na úrovni operačního systému a popsány v souborech permissions.xml na každém zařízení. Aplikace pouze specifikuje uses-permission a systém automaticky přiřadí oprávnění k jeho skupině na základě protectionLevel a kategorizace v AOSP.
Přiřazení oprávnění ke skupině probíhá prostřednictvím atributu permissionGroup v systémové definici oprávnění. Například CAMERA je deklarováno s permissionGroup="android.permission-group.CAMERA", ACCESS_FINE_LOCATION — s permissionGroup="android.permission-group.LOCATION". Toto mapování je pevně stanoveno v kódu Android Open Source Project a je stejné na všech certifikovaných zařízeních.
Mechanismus skupin funguje na principu „jeden dialog na skupinu”. Když aplikace poprvé žádá o jakékoli nebezpečné oprávnění, systém zkontroluje jeho Permission Group. Pokud dosud nebylo uděleno žádné oprávnění z této skupiny — zobrazí se dialog. Po souhlasu systém označí celou skupinu jako udělenou a následné žádosti o jiná oprávnění ze stejné skupiny jsou splněny bez uživatelského rozhraní.
Algoritmus zjednodušeně vypadá následovně:
Tento mechanismus se vztahuje pouze na nebezpečná oprávnění. Normální oprávnění nemají skupiny a neúčastní se této logiky. Privilegovaná a podepsaná oprávnění se také neseskupují — mají samostatný systém řízení přístupu.
Skupiny nefungují opačným směrem: odvolání jednoho oprávnění ze skupiny prostřednictvím nastavení odvolá pouze toto oprávnění, aniž by ovlivnilo ostatní. Pokud uživatel odmítl dialog pro skupinu, neblokuje to ostatní skupiny — každé nové oprávnění z jiné skupiny zobrazí vlastní dialog. Permission Group ovlivňuje pouze UX žádosti, nikoli bezpečnostní model.
Android definuje následující systémové Permission Groups pro nebezpečná oprávnění. Každá skupina zahrnuje jedno nebo více oprávnění spojených společným funkčním účelem.
| Identifikátor skupiny | Oprávnění ve skupině | Popis |
|---|---|---|
| CAMERA | CAMERA | Přístup kameře zařízení |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION | Geolokace (přesná a přibližná) |
| MICROPHONE | RECORD_AUDIO | Nahrávání zvuku z mikrofonu |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP | Telefonní funkce |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | Přístup ke kontaktům a účtům |
| SMS | READ_SMS, SEND_SMS, RECEIVE_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS | Odesílání a příjem SMS |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE | Čtení a zápis externího úložiště |
| CALENDAR | READ_CALENDAR, WRITE_CALENDAR | Přístup ke kalendáři |
| SENSORS | BODY_SENSORS | Tělesné senzory (puls a další) |
| ACTIVITY_RECOGNITION | ACTIVITY_RECOGNITION | Rozpoznávání fyzické aktivity |
V Android 13 (API 33) se objevila nová skupina NEARBY_DEVICES, kombinující BLUETOOTH_SCAN, BLUETOOTH_CONNECT a BLUETOOTH_ADVERTISE. Také skupina STORAGE byla částečně nahrazena mediálními oprávněními READ_MEDIA_IMAGES, READ_MEDIA_VIDEO a READ_MEDIA_AUDIO, která nejsou součástí STORAGE, ale jsou nezávislými nebezpečnými oprávněními bez seskupování.
Vývojáři mohou deklarovat vlastní oprávnění s vlastními Permission Groups pomocí atributu permissionGroup v manifestu. To však funguje pouze pro vlastní oprávnění stejné aplikace a neovlivňuje systémové UI dialogy. V praxi se vlastní Permission Groups používají zřídka — pro interakci mezi vlastními aplikacemi v jednom zásobníku.
Vliv Permission Group na uživatelský zážitek je významný. Díky seskupování uživatel nevidí 8 samostatných dialogů pro různá oprávnění, ale několik skupinových dialogů. To snižuje kognitivní zátěž a snižuje pravděpodobnost, že uživatel odmítne kritické oprávnění, aniž by pochopil jeho účel.
UX výzkumy ukazují, že skupinové dialogy jsou uživateli vnímány jako transparentnější. Když aplikace žádá o „přístup ke kameře”, uživatel chápe kontext. Pokud by každé oprávnění bylo žádáno samostatně — CAMERA, CAMERA2, FLASHLIGHT — vytvořilo by to dojem nadbytečnosti. Permission Group tuto podrobnost abstrahuje.
Nejlepší praxí je žádat o oprávnění pouze z jedné skupiny najednou. Pokud aplikace potřebuje kameru i geolokaci, nežádejte o ně jediným voláním requestPermissions. Nejprve požádejte o jednu skupinu po vysvětlení, poté o druhou. To dává uživateli kontrolu a postupné pochopení každé funkce.
Permission Group a ProtectionLevel — to jsou dva různé rozměry systému oprávnění Androidu. ProtectionLevel určuje, jak je oprávnění udělováno (normal, dangerous, signature, privileged), zatímco Permission Group je kategorie pro zobrazení v UI. Jsou nezávislé, ale v praxi je kombinace dangerous + permission group nejčastější.
Oprávnění stejného ProtectionLevel mohou patřit do různých skupin. Například ACCESS_FINE_LOCATION a CAMERA mají obě protectionLevel dangerous, ale patří do různých skupin — LOCATION a CAMERA. A naopak, oprávnění se stejným názvem vždy patří do stejné skupiny: ACCESS_FINE_LOCATION a ACCESS_COARSE_LOCATION jsou obě v LOCATION.
Vyšší úrovně ochrany — signature a privileged — nepoužívají Permission Group pro UI. Jejich udělování je řízeno na úrovni systému: signature je udělováno aplikacím podepsaným stejným certifikátem jako systém, a privileged aplikacím v systémovém obrazu. Skupiny pro taková oprávnění existují, ale neovlivňují UX dialogy, protože tyto dialogy jednoduše neexistují.
Vývojář může programově určit Permission Group libovolného oprávnění prostřednictvím PackageManager. Metoda getPermissionInfo vrací PermissionInfo s polem group obsahujícím řetězcový identifikátor skupiny. To je užitečné pro logování, analytiku a vlastní UI obrazovky oprávnění.
fun getPermissionGroupName(
permission: String
): String? {
return try {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
info.group
} catch (e: NameNotFoundException) {
null
}
}
fun getPermissionsByGroup(
group: String
): List<String> {
val pm = packageManager
val perms = pm.queryPermissionsByGroup(
group,
PackageManager.GET_META_DATA
)
return perms.map { it.name }
}
Znalost Permission Group pomáhá při budování architektury žádostí. Lze vytvořit abstrakci PermissionGroupProvider, která vrací seznam oprávnění pro konkrétní skupinu. To zjednodušuje testování: v jednotkových testech provider vrací falešná data bez volání PackageManager. V instrumentálních testech — skutečné skupiny ze systému.
Integrace PermissionGroupProvider prostřednictvím Dagger Hilt nebo Koin umožňuje centralizované řízení mapování oprávnění a skupin. V provideru lze uložit do mezipaměti výsledek PackageManager.queryPermissionsByGroup, aby se předešlo opakovaným systémovým voláním při každé žádosti. To je důležité zejména pro obrazovky nastavení, kde se zobrazuje úplný seznam oprávnění a jejich stav.
Při sběru analytiky o odmítnutích je užitečné logovat nejen název oprávnění, ale také jeho Permission Group. To pomáhá identifikovat funkční oblasti, které způsobují nejvíce odmítnutí. Například skupina LOCATION má tradičně nejvyšší procento odmítnutí — kolem 40 procent, podle statistik Google Play Console.
Analytika podle skupin pomáhá při produktových rozhodnutích: pokud má skupina CONTACTS vysoké procento odmítnutí, možná stojí za to přehodnotit načasování žádosti nebo přidat vysvětlující dialog. Skupinový přístup k analytice poskytuje úplnější obrázek než analýza jednotlivých oprávnění, protože počet odmítnutí pro celou skupinu odráží obecný postoj uživatelů k funkční oblasti.
Často kladené otázky
Permission Group — mechanismus pro kombinování funkčně souvisejících nebezpečných oprávnění do jedné kategorie. Pokud uživatel udělil jedno oprávnění ze skupiny, ostatní jsou automaticky udělena bez dalšího dialogu.
Ve standardním Androidu je asi 10 hlavních skupin: CAMERA, LOCATION, MICROPHONE, PHONE, CONTACTS, SMS, STORAGE, CALENDAR, SENSORS a ACTIVITY_RECOGNITION. V Android 13+ byla přidána NEARBY_DEVICES.
Ano, pomocí atributu permissionGroup v AndroidManifest.xml pro vlastní oprávnění. Ale funguje to pouze pro oprávnění v rámci aplikace a neovlivňuje systémové UI dialogy. V praxi se používá zřídka.
Odvolání jednoho oprávnění ze skupiny neodvolává ostatní. Uživatel může zakázat ACCESS_FINE_LOCATION, ale ACCESS_COARSE_LOCATION zůstane aktivní. Skupina ovlivňuje pouze udělování, nikoli odvolávání.
Použijte PackageManager.getPermissionInfo a přečtěte pole group. Metoda vrací řetězcový identifikátor skupiny, například android.permission-group.CAMERA. Pokud oprávnění nemá skupinu, pole bude null.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také