Permission Group az engedélyek csoportosításának mechanizmusa Androidban, amely a funkcionálisan összefüggő veszélyes engedélyeket egy logikai kategóriába egyesíti. A Android Permissions Overview, 2024 szerint, az engedélycsoportok egyszerűsítik a felhasználói felületet: ha a felhasználó megadott egy engedélyt egy csoportból, a többiek automatikusan kiadásra kerülnek további párbeszédablakok nélkül. Ez csökkenti a kérések számát és javítja az UX-t.
Főbb pontok
Permission Group — ez egy Android rendszermechanizmus, amely több veszélyes engedélyt egy csoportba egyesít azok funkcionális rendeltetése alapján. Minden csoport rendelkezik egy sztringazonosítóval, például android.permission-group.CAMERA vagy android.permission-group.LOCATION. Az egy csoporton belüli összes engedély logikailag összefügg és hozzáférést biztosít az eszköz rokon funkcióihoz.
Az engedélycsoportok az Android 6.0 Marshmallow-ban jelentek meg a runtime kérési modellel együtt. Fő céljuk a felhasználóval való interakció egyszerűsítése: ahelyett, hogy minden egyes engedélyhez párbeszédablakok sorozatát jelenítené meg, a rendszer csoportonként egy párbeszédablakot mutat. Ha a felhasználó megadott egy engedélyt egy csoportból, a többiek automatikusan jóváhagyottnak tekintendők. A Android UX Research (2015) szerint ez 20 százalékkal csökkentette az első indításkori elutasítások számát.
Fontos megérteni, hogy a fejlesztő nem hozhat létre saját Permission Group-okat. A csoportok előre meghatározottak az operációs rendszer szintjén, és a permissions.xml fájlokban vannak leírva minden eszközön. Az alkalmazás csak a uses-permission-t adja meg, a rendszer pedig automatikusan hozzárendeli az engedélyt a csoportjához a protectionLevel és az AOSP-beli kategorizálás alapján.
Az engedély csoporthoz rendelése a permissionGroup attribútumon keresztül történik a rendszer engedélydefiníciójában. Például a CAMERA a permissionGroup="android.permission-group.CAMERA", az ACCESS_FINE_LOCATION pedig a permissionGroup="android.permission-group.LOCATION" paraméterrel van deklarálva. Ez a leképezés szigorúan rögzített az Android Open Source Project kódjában, és minden tanúsított eszközön azonos.
A csoportmechanizmus az „egy párbeszédablak csoportonként" elv szerint működik. Amikor az alkalmazás először kér bármilyen veszélyes engedélyt, a rendszer ellenőrzi annak Permission Group-ját. Ha még egyetlen engedélyt sem adtak meg ebből a csoportból — megjelenik egy párbeszédablak. A beleegyezés után a rendszer az egész csoportot megadottként jelöli meg, és a későbbi kérések ugyanabból a csoportból származó más engedélyekre felhasználói felület nélkül teljesülnek.
Az algoritmus egyszerűsítve így néz ki:
Ez a mechanizmus csak a veszélyes engedélyekre vonatkozik. A normál engedélyeknek nincs csoportjuk, és nem vesznek részt ebben a logikában. A privilegizált és aláírt engedélyek szintén nem csoportosíthatók — külön hozzáférés-kezelő rendszerrel rendelkeznek.
A csoportok nem működnek fordított irányban: egy engedély visszavonása egy csoportból a beállításokon keresztül csak azt vonja vissza, a többire nincs hatással. Továbbá, ha a felhasználó elutasította a párbeszédablakot egy csoport számára, ez nem blokkolja a másik csoportokat — minden új engedély egy másik csoportból megjeleníti a saját párbeszédablakát. Permission Group csak a kérés UX-ére van hatással, nem a biztonsági modellre.
Az Android meghatározza a következő rendszer-Permission Group-okat a veszélyes engedélyek számára. Minden csoport egy vagy több engedélyt foglal magában, amelyeket közös funkcionális cél egyesít.
| Csoport azonosító | Engedélyek a csoportban | Leírás |
|---|---|---|
| CAMERA | CAMERA | Hozzáférés az eszköz kamerájához |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION | Helymeghatározás (pontos és közelítő) |
| MICROPHONE | RECORD_AUDIO | Hangfelvétel a mikrofonból |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP | Telefon funkciók |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | Hozzáférés a névjegyzékhez és fiókokhoz |
| SMS | READ_SMS, SEND_SMS, RECEIVE_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS | SMS küldése és fogadása |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE | Külső tároló olvasása és írása |
| CALENDAR | READ_CALENDAR, WRITE_CALENDAR | Hozzáférés a naptárhoz |
| SENSORS | BODY_SENSORS | Testszenzorok (pulzus és mások) |
| ACTIVITY_RECOGNITION | ACTIVITY_RECOGNITION | Fizikai aktivitás felismerése |
Az Android 13-ban (API 33) megjelent egy új csoport NEARBY_DEVICES, amely egyesíti a BLUETOOTH_SCAN, BLUETOOTH_CONNECT és BLUETOOTH_ADVERTISE engedélyeket. A STORAGE csoportot részben felváltották a READ_MEDIA_IMAGES, READ_MEDIA_VIDEO és READ_MEDIA_AUDIO médiaengedélyek, amelyek nem képezik részét a STORAGE-nak, hanem csoportosítás nélküli független veszélyes engedélyek.
A fejlesztők saját engedélyeket deklarálhatnak egyéni Permission Group-okkal a permissionGroup attribútumon keresztül a manifesztumban. Ez azonban csak az alkalmazáson belüli egyéni engedélyekre működik, és nem befolyásolja a rendszer UI-párbeszédablakait. A gyakorlatban az egyéni Permission Group-okat ritkán használják — a saját alkalmazások közötti interakcióra egy veremben.
A Permission Group hatása a felhasználói élményre jelentős. A csoportosításnak köszönhetően a felhasználó nem 8 külön párbeszédablakot lát a különböző engedélyekhez, hanem néhány csoportos párbeszédablakot. Ez csökkenti a kognitív terhelést és csökkenti annak valószínűségét, hogy a felhasználó elutasít egy kritikus engedélyt anélkül, hogy megértené a célját.
Az UX-kutatások azt mutatják, hogy a csoportos párbeszédablakokat a felhasználók átláthatóbbnak érzékelik. Amikor az alkalmazás „kamerahozzáférést" kér, a felhasználó érti a kontextust. Ha minden engedélyt külön kérnének — CAMERA, CAMERA2, FLASHLIGHT — ez redundancia érzetét keltené. Permission Group elvonatkoztatja ezt a részletezést.
A legjobb gyakorlat az, hogy egyszerre csak egy csoportból kérjünk engedélyeket. Ha az alkalmazásnak mind kamerára, mind helymeghatározásra szüksége van, ne kérje őket egyetlen requestPermissions hívással. Először kérje az egyik csoportot magyarázat után, majd a másodikat. Ez irányítást és az egyes funkciók fokozatos megértését biztosítja a felhasználó számára.
Permission Group és ProtectionLevel — ez az Android engedélyrendszerének két különböző dimenziója. A ProtectionLevel meghatározza, hogy az engedély hogyan kerül kiadásra (normal, dangerous, signature, privileged), a Permission Group pedig egy kategória a UI megjelenítéshez. Függetlenek egymástól, de a gyakorlatban a dangerous + permission group kombináció a leggyakoribb.
Az azonos ProtectionLevelű engedélyek különböző csoportokba tartozhatnak. Például az ACCESS_FINE_LOCATION és a CAMERA egyaránt protectionLevel dangerous besorolású, de különböző csoportokba — LOCATION és CAMERA — tartoznak. És fordítva, az azonos nevű engedélyek mindig ugyanabba a csoportba tartoznak: az ACCESS_FINE_LOCATION és az ACCESS_COARSE_LOCATION egyaránt a LOCATION-ban van.
Magasabb szintű védelmi szintek — signature és privileged — nem használnak Permission Group-ot a UI-hoz. Kiadásuk rendszerszinten történik: a signature-t azok az alkalmazások kapják, amelyeket ugyanaz a tanúsítvány írt alá, mint a rendszert, a privileged-t pedig a rendszerképben lévő alkalmazások. Az ilyen engedélyek csoportjai léteznek, de nem befolyásolják az UX-párbeszédablakokat, mert ezek a párbeszédablakok egyszerűen nem léteznek.
A fejlesztő programozottan meghatározhatja bármely engedély Permission Group-ját a PackageManager segítségével. A getPermissionInfo metódus egy PermissionInfo-t ad vissza a group mezővel, amely tartalmazza a csoport sztringazonosítóját. Ez hasznos naplózáshoz, analitikához és egyéni engedély UI-képernyőkhöz.
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 }
}
A Permission Group ismerete segít a kérési architektúra felépítésében. Létrehozható egy PermissionGroupProvider absztrakció, amely egy adott csoporthoz tartozó engedélyek listáját adja vissza. Ez leegyszerűsíti a tesztelést: az egységtesztekben a provider hamis adatokat ad vissza a PackageManager meghívása nélkül. Az instrumentális tesztekben — valódi csoportokat a rendszerből.
A PermissionGroupProvider integrálása Dagger Hilt vagy Koin segítségével lehetővé teszi az engedélyek és csoportok leképezésének központosított kezelését. A provider-ben a PackageManager.queryPermissionsByGroup eredménye gyorsítótárba helyezhető, hogy elkerüljük az ismétlődő rendszerhívásokat minden kérésnél. Ez különösen fontos a beállítások képernyőn, ahol az összes engedély és azok állapota látható.
Az elutasításokkal kapcsolatos analitika gyűjtésekor hasznos nemcsak az engedély nevét, hanem a Permission Group-ját is naplózni. Ez segít azonosítani azokat a funkcionális területeket, amelyek a legtöbb elutasítást okozzák. Például a LOCATION csoport hagyományosan a legmagasabb elutasítási aránnyal rendelkezik — körülbelül 40 százalék, a Google Play Console statisztikái szerint.
A csoportonkénti analitika segít termékdöntések meghozatalában: ha a CONTACTS csoport magas elutasítási aránnyal rendelkezik, érdemes lehet újragondolni a kérés időpontját vagy magyarázó párbeszédablakot hozzáadni. A csoportalapú megközelítés az analitikában teljesebb képet ad, mint az egyes engedélyek elemzése, mert a teljes csoportra vonatkozó elutasítások száma tükrözi a felhasználók általános hozzáállását a funkcionális területhez.
Gyakran ismételt kérdések
Permission Group — mechanizmus a funkcionálisan összefüggő veszélyes engedélyek egy kategóriába egyesítésére. Ha a felhasználó megadott egy engedélyt a csoportból, a többiek automatikusan kiadásra kerülnek további párbeszédablak nélkül.
A standard Androidban körülbelül 10 fő csoport van: CAMERA, LOCATION, MICROPHONE, PHONE, CONTACTS, SMS, STORAGE, CALENDAR, SENSORS és ACTIVITY_RECOGNITION. Android 13+-ban hozzáadták a NEARBY_DEVICES-t.
Igen, a permissionGroup attribútumon keresztül az AndroidManifest.xml-ben egyéni engedélyek számára. De ez csak az alkalmazáson belüli engedélyekre működik, és nem befolyásolja a rendszer UI-párbeszédablakait. A gyakorlatban ritkán használják.
Egy engedély visszavonása egy csoportból nem vonja vissza a többit. A felhasználó kikapcsolhatja az ACCESS_FINE_LOCATION-t, de az ACCESS_COARSE_LOCATION aktív marad. A csoport csak a megadásra van hatással, nem a visszavonásra.
Használja a PackageManager.getPermissionInfo metódust és olvassa le a group mezőt. A metódus visszaadja a csoport sztringazonosítóját, például android.permission-group.CAMERA. Ha az engedélynek nincs csoportja, a mező értéke null lesz.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is