Normal Permission — kategorie oprávnění v Androidu, která systém uděluje automaticky bez dotazu uživatele. Podle Android Developer Documentation, 2024 mají normální oprávnění ProtectionLevel normal a na rozdíl od nebezpečných nevyžadují runtime dialog. Zahrnují přístup k internetu, stavu sítě a vibracím, aniž by představovaly riziko pro důvěrná data uživatele.
Hlavní
Normal Permission — typ systémových oprávnění Android s ProtectionLevel normal, udělovaný aplikaci automaticky v okamžiku instalace. Vývojář nemusí psát kód pro požadavek — stačí uvést oprávnění v AndroidManifest.xml. Uživatel nevidí dialogy a nemůže normal permission odvolat samostatně, pouze smazáním celé aplikace.
Systém Android klasifikuje normální oprávnění jako nízkoriziková — neposkytují přístup k osobním údajům, kameře ani mikrofonu. Typické příklady: přístup k internetu, správa vibrací, čtení stavu Wi-Fi. Podle Android Security Model (2024) patří přibližně 40 procent všech systémových oprávnění do kategorie normal.
Důležitá vlastnost — normální oprávnění se neodvolávají za běhu přes Settings. Pokud chce uživatel zakázat přístup, jediný způsob je smazání aplikace. Vývojáři by to měli zohlednit v architektuře, ale pro uživatele tento přístup zjednodušuje interakci: žádné dialogy při prvním spuštění.
Rozdělení na normální a nebezpečná oprávnění se objevilo v Android 6.0 Marshmallow (API 23). Před touto verzí byla všechna oprávnění vyžadována při instalaci — uživatel viděl jediný seznam a buď ho celý přijal, nebo odmítl. Normal Permission zachoval tento model pro nízkorizikové operace, zatímco Dangerous přešel na runtime požadavek. Tato změna zlepšila uživatelský zážitek a zároveň zvýšila bezpečnost.
Mnoho systémových API Android vyžaduje explicitní uvedení normálního oprávnění, i když je přístup automatický. Například třída ConnectivityManager vyžaduje ACCESS_NETWORK_STATE, VibratorService vyžaduje VIBRATE, WifiManager vyžaduje ACCESS_WIFI_STATE. Bez deklarace odpovídajícího uses-permission povede volání těchto API k SecurityException.
ProtectionLevel normal — minimální úroveň ochrany v Android Permission System. Oprávnění s touto úrovní se deklarují v manifestu a systém kontroluje deklaraci při instalaci, přičemž uděluje přístup bez zásahu uživatele. Nezobrazují se žádné prvky UI, nevolají se žádné callbacky.
Kontrolní mechanismus funguje na úrovni PackageManager. Při instalaci APK systém prohledá všechny tagy uses-permission, určí úroveň ochrany každého oprávnění porovnáním s definicemi systému v souborech permissions.xml a pro normal-level jednoduše zaregistruje přístup. Proces trvá milisekundy a nevyžaduje interakci s uživatelským rozhraním.
Algoritmus udělování vypadá následovně:
Uživatel nemůže normální oprávnění odvolat přes rozhraní. V nastavení aplikace v sekci Oprávnění se zobrazují pouze nebezpečná oprávnění. To je v kontrastu s iOS, kde každé oprávnění vyžaduje samostatné potvrzení bez ohledu na úroveň citlivosti funkce.
Normal a Dangerous Permission — dvě protichůdné kategorie ochrany v Androidu. Hlavní rozdíl je ve způsobu udělování: normální se dávají automaticky při instalaci, nebezpečná vyžadují výslovný souhlas prostřednictvím runtime dialogu. Tento rozdíl je zabudován do bezpečnostní architektury Androidu od verze 6.0 Marshmallow.
Porovnání klíčových vlastností:
| Vlastnost | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| Dotaz na uživatele | Není vyžadován | Runtime dialog povinný |
| Možnost odvolání | Ne, pouze smazání aplikace | Ano, přes nastavení kdykoli |
| Kontrola v kódu | Vždy PERMISSION_GRANTED | checkSelfPermission povinný |
| Příklady | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
Uživatel nevidí žádné dialogy při požadavku Normal Permission. Pokud aplikace potřebuje INTERNET — získá jej potichu. Pro Dangerous Permission systém zobrazí modální dialog s popisem požadovaného přístupu. Uživatel stiskne Allow nebo Deny a později může oprávnění kdykoli odvolat přes Settings. To je klíčový UX rozdíl, který určuje strategii vývoje rozhraní.
Normal by se měl používat ve všech případech, kdy se přístup netýká citlivých údajů. ACCESS_NETWORK_STATE pro kontrolu připojení, VIBRATE pro hmatovou zpětnou vazbu, INTERNET pro HTTP požadavky — to vše jsou normální oprávnění. Použití nebezpečné úrovně tam, kde stačí normal, je špatná praxe, vytváří zbytečné dialogy a snižuje důvěru uživatele v aplikaci.
Android definuje desítky normálních oprávnění, z nichž každé odpovídá určité systémové funkci. Všechna jsou přístupná prostřednictvím konstant třídy Manifest.permission. Níže je uveden seznam nejčastěji používaných při vývoji aplikací.
| Konstanta | Přístup | Popis |
|---|---|---|
| INTERNET | Síť | Otevírání síťových socketů pro HTTP požadavky |
| ACCESS_NETWORK_STATE | Síť | Získávání informací o stavu sítě |
| ACCESS_WIFI_STATE | Wi-Fi | Čtení informací o Wi-Fi připojeních |
| VIBRATE | Vibrace | Ovládání vibračního motoru zařízení |
| BLUETOOTH | Bluetooth | Připojování k Bluetooth zařízením |
| WAKE_LOCK | Napájení | Blokování přechodu procesoru do režimu spánku |
| SET_ALARM | Budík | Nastavení budíku přes AlarmManager |
| CHANGE_NETWORK_STATE | Síť | Změna stavu síťového připojení |
Normální oprávnění se neseskupují do Permission Group pro účely zobrazení v UI. Skupiny v Androidu jsou určeny pro obrazovku nastavení, kde se zobrazují pouze nebezpečná oprávnění. Logicky však lze normální oprávnění rozdělit do kategorií: síťová (INTERNET, ACCESS_NETWORK_STATE), hardwarová (VIBRATE, WAKE_LOCK), systémová (SET_ALARM) a Bluetooth oprávnění.
Některé konstanty z Manifest.permission mohou měnit úroveň ochrany v různých verzích Androidu. Například BLUETOOTH_CONNECT se na Android 12+ stal nebezpečným oprávněním s runtime požadavkem, ačkoli ve starších verzích byl normal. Vývojářům se doporučuje kontrolovat aktuální protectionLevel pro cílové API prostřednictvím dokumentace.
Vývojář může programově zkontrolovat, zda je oprávnění normální, přes PackageManager. Metoda getPermissionInfo vrací PermissionInfo, jehož pole protectionLevel obsahuje příznak PermissionInfo.PROTECTION_NORMAL. To je užitečné pro dynamické zpracování a ladění.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Deklarace Normal Permission v AndroidManifest.xml je nejjednodušší operace, vyžadující pouze jeden tag uses-permission. Dodatečná konfigurace protectionLevel není nutná, protože úroveň ochrany je určena systémovou definicí, nikoli manifestem aplikace. Vývojář jednoduše uvede celý název konstanty.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
Systém při instalaci zpracovává všechny deklarace. Pokud má alespoň jedno z uvedených oprávnění protectionLevel odlišný od normal, bude vyžadován runtime požadavek. INTERNET — nejpopulárnější normální oprávnění, přítomné ve většině Android aplikací, zejména těch, které provádějí HTTP požadavky nebo načítají obsah ze sítě.
Úplný příklad AndroidManifest.xml s normálními a nebezpečným oprávněním ukazuje rozdíl: syntakticky jsou tagy uses-permission stejné, ale ve fázi provádění budou INTERNET a VIBRATE uděleny automaticky, zatímco CAMERA bude vyžadovat dialog.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
Při používání knihoven — Google Play Services, Firebase, Glide — mohou tyto přidávat vlastní uses-permission do výsledného manifestu prostřednictvím Manifest Merger. Některé z nich jsou normální (INTERNET pro Firebase), jiné nebezpečné (ACCESS_FINE_LOCATION pro Google Maps). Vývojář by měl zkontrolovat výsledný sloučený manifest v build/outputs/logs/manifest-merger-report.txt před publikací.
Normal Permission má dvě zásadní omezení: nemožnost odvolání uživatelem a absenci UI pro správu. Pokud uživatel aplikaci nedůvěřuje, ale normální oprávnění již bylo automaticky uděleno — jediným východiskem je smazání aplikace. To vytváří určité riziko, protože normální oprávnění nejsou blokována standardními nástroji Androidu.
Další omezení se projevuje na zařízeních s více profily (Work Profile, Multiple Users). Normal Permission je uděleno okamžitě pro všechny profily — aplikace nemůže oprávnění omezit pouze na jeden. V podnikových scénářích se to řeší prostřednictvím Managed Configurations.
Nelze zkontrolovat, zda aplikace aktuálně používá Normal Permission. Systémová metoda checkSelfPermission funguje pouze pro nebezpečná oprávnění. Pro normal vždy vrací PERMISSION_GRANTED, což neodráží skutečnou aktivitu. To je třeba zohlednit při bezpečnostním auditu a analýze chování aplikace.
Rovněž je třeba mít na paměti, že někteří výrobci zařízení (Xiaomi, Huawei, Samsung) upravují standardní chování oprávnění. Na jejich firmware může Normal Permission vyžadovat dodatečná povolení ve vlastním prostředí MIUI nebo EMUI. Vývojářům se doporučuje testovat fungování na reálných zařízeních různých výrobců.
Často kladené otázky
Normal Permission se uděluje automaticky při instalaci bez dialogu. Dangerous vyžaduje runtime požadavek s výslovným souhlasem uživatele a lze jej odvolat přes nastavení. Normal používá ProtectionLevel normal, Dangerous — protectionLevel dangerous.
Ne, pro normální oprávnění stačí deklarovat uses-permission v AndroidManifest.xml. Kód pro požadavek není nutný — systém uděluje přístup automaticky. To je odlišuje od nebezpečných, kde je potřeba ActivityCompat.requestPermissions.
Nejčastěji používaná: INTERNET (síťové požadavky), ACCESS_NETWORK_STATE (kontrola připojení), VIBRATE (hmatová zpětná vazba) a WAKE_LOCK (udržení procesoru). Prakticky každá Android aplikace používá alespoň INTERNET.
Ne, Normal Permission nelze odvolat prostřednictvím nastavení aplikace. Jediný způsob, jak zastavit přístup, je smazání aplikace. To je klíčový rozdíl od nebezpečných oprávnění, která může uživatel kdykoli vypnout.
Použijte PackageManager.getPermissionInfo s předáním názvu oprávnění. Metoda vrací PermissionInfo s polem protectionLevel. Porovnejte s konstantami PermissionInfo.PROTECTION_NORMAL nebo PROTECTION_DANGEROUS pro určení kategorie.
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é