Normal Permission — o categorie de permisiuni în Android pe care sistemul le acordă automat fără a întreba utilizatorul. Conform Android Developer Documentation, 2024, permisiunile normale au ProtectionLevel normal și nu necesită dialog runtime, spre deosebire de cele periculoase. Ele acoperă accesul la internet, starea rețelei și vibrații, fără a crea riscuri pentru datele confidențiale ale utilizatorului.
Principalul
Normal Permission — un tip de permisiuni de sistem Android cu ProtectionLevel normal, acordat aplicației automat în momentul instalării. Dezvoltatorul nu trebuie să scrie cod pentru solicitare — este suficient să indice permisiunea în AndroidManifest.xml. Utilizatorul nu vede dialoguri și nu poate revoca normal permission separat, doar ștergând întreaga aplicație.
Sistemul Android clasifică permisiunile normale ca fiind cu risc scăzut — ele nu oferă acces la date personale, cameră sau microfon. Exemple tipice: acces la internet, gestionarea vibrațiilor, citirea stării Wi-Fi. Conform Android Security Model (2024), aproximativ 40 la sută din toate permisiunile de sistem aparțin categoriei normal.
O proprietate importantă — permisiunile normale nu se revocă în runtime prin Settings. Dacă utilizatorul dorește să interzică accesul, singura cale este ștergerea aplicației. Dezvoltatorii ar trebui să țină cont de acest lucru în arhitectură, dar pentru utilizatori o astfel de abordare simplifică interacțiunea: fără dialoguri la prima pornire.
Împărțirea în permisiuni normale și periculoase a apărut în Android 6.0 Marshmallow (API 23). Înainte de această versiune, toate permisiunile erau solicitate la instalare — utilizatorul vedea o listă unică și o accepta sau respingea în totalitate. Normal Permission a păstrat acest model pentru operațiunile cu risc scăzut, iar Dangerous a trecut la solicitarea runtime. Această modificare a îmbunătățit experiența utilizatorului și a crescut simultan securitatea.
Multe API de sistem Android necesită indicarea explicită a permisiunii normale, chiar dacă accesul este automat. De exemplu, clasa ConnectivityManager necesită ACCESS_NETWORK_STATE, VibratorService necesită VIBRATE, WifiManager necesită ACCESS_WIFI_STATE. Fără declararea uses-permission corespunzătoare, apelarea acestor API va duce la SecurityException.
ProtectionLevel normal — nivelul minim de protecție în Android Permission System. Permisiunile cu acest nivel se declară în manifest, iar sistemul verifică declarația la instalare, acordând acces fără intervenția utilizatorului. Nu se afișează niciun element UI, nu se apelează niciun callback.
Mecanismul de verificare funcționează la nivelul PackageManager. La instalarea APK-ului, sistemul scanează toate tag-urile uses-permission, determină nivelul de protecție al fiecărei permisiuni prin potrivirea cu definițiile de sistem din fișierele permissions.xml și pentru normal-level pur și simplu înregistrează accesul. Procesul durează milisecunde și nu necesită interacțiune cu interfața utilizatorului.
Algoritmul de acordare arată astfel:
Utilizatorul nu poate revoca permisiunea normală prin interfață. În setările aplicației, în secțiunea Permisiuni, se afișează doar permisiunile periculoase. Acest lucru contrastează cu iOS, unde fiecare permisiune necesită confirmare separată indiferent de nivelul de sensibilitate al funcției.
Normal și Dangerous Permission — două categorii opuse de protecție în Android. Diferența principală constă în modul de acordare: cele normale se acordă automat la instalare, cele periculoase necesită consimțământ explicit prin dialog runtime. Această diferență este încorporată în arhitectura de securitate Android începând cu versiunea 6.0 Marshmallow.
Compararea caracteristicilor cheie:
| Caracteristică | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| Solicitarea utilizatorului | Nu este necesară | Dialog runtime obligatoriu |
| Posibilitatea de revocare | Nu, doar ștergerea aplicației | Da, prin setări în orice moment |
| Verificare în cod | Întotdeauna PERMISSION_GRANTED | checkSelfPermission obligatoriu |
| Exemple | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
Utilizatorul nu vede niciun dialog la solicitarea Normal Permission. Dacă aplicația are nevoie de INTERNET — îl primește în tăcere. Pentru Dangerous Permission, sistemul afișează un dialog modal cu descrierea accesului solicitat. Utilizatorul apasă Allow sau Deny, iar mai târziu poate revoca permisiunea în orice moment prin Settings. Aceasta este diferența cheie UX care determină strategia de dezvoltare a interfeței.
Normal trebuie utilizat în toate cazurile când accesul nu se referă la date sensibile. ACCESS_NETWORK_STATE pentru verificarea conexiunii, VIBRATE pentru feedback tactil, INTERNET pentru cereri HTTP — toate acestea sunt permisiuni normale. Utilizarea nivelului dangerous acolo unde este suficient normal este o practică proastă, creând dialoguri inutile și reducând încrederea utilizatorului în aplicație.
Android definește câteva zeci de permisiuni normale, fiecare corespunzând unei funcții de sistem specifice. Toate sunt accesibile prin constantele clasei Manifest.permission. Mai jos este lista celor mai frecvent utilizate în dezvoltarea aplicațiilor.
| Constanta | Acces | Descriere |
|---|---|---|
| INTERNET | Rețea | Deschiderea socket-urilor de rețea pentru cereri HTTP |
| ACCESS_NETWORK_STATE | Rețea | Obținerea informațiilor despre starea rețelei |
| ACCESS_WIFI_STATE | Wi-Fi | Citirea informațiilor despre conexiunile Wi-Fi |
| VIBRATE | Vibrație | Gestionarea motorului de vibrații al dispozitivului |
| BLUETOOTH | Bluetooth | Conectarea la dispozitive Bluetooth |
| WAKE_LOCK | Alimentare | Blocarea trecerii procesorului în somn |
| SET_ALARM | Alarmă | Setarea alarmei prin AlarmManager |
| CHANGE_NETWORK_STATE | Rețea | Modificarea stării conexiunii de rețea |
Permisiunile normale nu sunt grupate în Permission Group în scopuri de afișare în UI. Grupurile în Android sunt destinate ecranului de setări, unde se afișează doar permisiunile periculoase. Cu toate acestea, logic, permisiunile normale pot fi împărțite în categorii: de rețea (INTERNET, ACCESS_NETWORK_STATE), hardware (VIBRATE, WAKE_LOCK), de sistem (SET_ALARM) și permisiuni Bluetooth.
Unele constante din Manifest.permission pot schimba nivelul de protecție pe diferite versiuni de Android. De exemplu, BLUETOOTH_CONNECT pe Android 12+ a devenit o permisiune periculoasă cu solicitare runtime, deși în versiunile mai vechi era normal. Dezvoltatorilor li se recomandă să verifice protectionLevel-ul actual pentru API-ul țintă prin documentație.
Dezvoltatorul poate verifica programatic dacă o permisiune este normală prin PackageManager. Metoda getPermissionInfo returnează PermissionInfo, al cărui câmp protectionLevel conține flag-ul PermissionInfo.PROTECTION_NORMAL. Acest lucru este util pentru procesarea dinamică și depanare.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Declararea Normal Permission în AndroidManifest.xml este cea mai simplă operațiune, care necesită un singur tag uses-permission. Configurarea suplimentară protectionLevel nu este necesară, deoarece nivelul de protecție este determinat de definiția de sistem, nu de manifestul aplicației. Dezvoltatorul indică pur și simplu numele complet al constantei.
<!-- 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" />
Sistemul la instalare procesează toate declarațiile. Dacă cel puțin una dintre permisiunile indicate are protectionLevel diferit de normal, va fi necesară solicitarea runtime. INTERNET — cea mai populară permisiune normală, prezentă în majoritatea aplicațiilor Android, în special a celor care execută cereri HTTP sau încarcă conținut din rețea.
Exemplul complet de AndroidManifest.xml cu permisiuni normale și periculoase demonstrează diferența: sintactic, tag-urile uses-permission sunt identice, dar în faza de execuție INTERNET și VIBRATE vor fi acordate automat, iar CAMERA va necesita 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>
La utilizarea bibliotecilor — Google Play Services, Firebase, Glide — acestea pot adăuga propriile uses-permission în manifestul final prin Manifest Merger. Unele dintre ele sunt normale (INTERNET pentru Firebase), altele periculoase (ACCESS_FINE_LOCATION pentru Google Maps). Dezvoltatorul ar trebui să verifice manifestul final îmbinat în build/outputs/logs/manifest-merger-report.txt înainte de publicare.
Normal Permission are două limitări fundamentale: imposibilitatea revocării de către utilizator și absența UI-ului pentru gestionare. Dacă utilizatorul nu are încredere în aplicație, dar permisiunea normală a fost deja acordată automat — singura soluție este ștergerea aplicației. Acest lucru creează un anumit risc, deoarece permisiunile normale nu sunt blocate de instrumentele standard Android.
O limitare suplimentară apare pe dispozitivele cu mai multe profiluri (Work Profile, Multiple Users). Normal Permission se acordă imediat pentru toate profilurile — aplicația nu poate limita permisiunea doar la unul. În scenariile corporative, acest lucru se rezolvă prin Managed Configurations.
Nu se poate verifica dacă aplicația utilizează Normal Permission în momentul respectiv. Metoda de sistem checkSelfPermission funcționează doar pentru permisiunile periculoase. Pentru normal, returnează întotdeauna PERMISSION_GRANTED, ceea ce nu reflectă activitatea reală. Acest lucru trebuie luat în considerare la auditul de securitate și analiza comportamentului aplicației.
De asemenea, merită reținut că unii producători de dispozitive (Xiaomi, Huawei, Samsung) modifică comportamentul standard al permisiunilor. Pe firmware-ul lor, Normal Permission poate necesita permisiuni suplimentare în interfața proprietară MIUI sau EMUI. Dezvoltatorilor li se recomandă să testeze funcționarea pe dispozitive reale ale diferiților producători.
Întrebări frecvente
Normal Permission se acordă automat la instalare fără dialog. Dangerous necesită solicitare runtime cu consimțământul explicit al utilizatorului și poate fi revocat prin setări. Normal folosește ProtectionLevel normal, Dangerous — protectionLevel dangerous.
Nu, pentru permisiunile normale este suficient să declarați uses-permission în AndroidManifest.xml. Codul pentru solicitare nu este necesar — sistemul acordă accesul automat. Acest lucru le deosebește de cele periculoase, unde este necesar ActivityCompat.requestPermissions.
Cele mai frecvent utilizate: INTERNET (cereri de rețea), ACCESS_NETWORK_STATE (verificarea conexiunii), VIBRATE (feedback tactil) și WAKE_LOCK (menținerea procesorului). Practic, fiecare aplicație Android folosește cel puțin INTERNET.
Nu, Normal Permission nu poate fi revocat prin setările aplicației. Singura modalitate de a opri accesul este ștergerea aplicației. Aceasta este diferența cheie față de permisiunile periculoase, pe care utilizatorul le poate dezactiva în orice moment.
Utilizați PackageManager.getPermissionInfo, transmițând numele string al permisiunii. Metoda returnează PermissionInfo cu câmpul protectionLevel. Comparați cu constantele PermissionInfo.PROTECTION_NORMAL sau PROTECTION_DANGEROUS pentru a determina categoria.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și