Normal Permission è una categoria di autorizzazioni in Android che il sistema concede automaticamente senza chiedere all’utente. Secondo Android Developer Documentation, 2024, le autorizzazioni normali hanno ProtectionLevel normal e non richiedono un dialogo runtime, a differenza di quelle pericolose. Coprono l’accesso a internet, allo stato della rete e alla vibrazione, senza creare rischi per i dati sensibili dell’utente.
Punti chiave
Normal Permission è un tipo di autorizzazione di sistema in Android con ProtectionLevel normal, concessa a un’applicazione automaticamente al momento dell’installazione. Lo sviluppatore non deve scrivere codice per richiederla — basta dichiarare l’autorizzazione in AndroidManifest.xml. L’utente non vede alcun dialogo e non può revocare un’autorizzazione normale separatamente, solo disinstallando l’intera applicazione.
Il sistema Android classifica le autorizzazioni normali come a basso rischio — non concedono accesso a dati personali, fotocamera o microfono. Esempi tipici: accesso a internet, controllo vibrazione, lettura stato Wi-Fi. Secondo Android Security Model (2024), circa il 40 per cento di tutte le autorizzazioni di sistema appartiene alla categoria normale.
Una proprietà importante — le autorizzazioni normali non possono essere revocate in runtime tramite Impostazioni. Se l’utente vuole negare l’accesso, l’unico modo è disinstallare l’applicazione. Gli sviluppatori dovrebbero considerarlo nell’architettura, ma per gli utenti questo approccio semplifica l’interazione: nessun dialogo al primo avvio.
La divisione in autorizzazioni normali e pericolose è apparsa in Android 6.0 Marshmallow (API 23). Prima di questa versione, tutte le autorizzazioni venivano richieste all’installazione — l’utente vedeva un unico elenco e lo accettava o rifiutava nel suo insieme. Normal Permission ha mantenuto questo modello per le operazioni a basso rischio, mentre Dangerous è passato alla richiesta runtime. Questo cambiamento ha migliorato l’esperienza utente e allo stesso tempo aumentato la sicurezza.
Molte API di sistema Android richiedono una dichiarazione esplicita di un’autorizzazione normale, anche se l’accesso è automatico. Ad esempio, la classe ConnectivityManager richiede ACCESS_NETWORK_STATE, VibratorService richiede VIBRATE, WifiManager richiede ACCESS_WIFI_STATE. Senza dichiarare il corrispondente uses-permission, la chiamata di queste API provocherà una SecurityException.
ProtectionLevel normal è il livello minimo di protezione nel Sistema di autorizzazioni Android. Le autorizzazioni con questo livello vengono dichiarate nel manifest, e il sistema verifica la dichiarazione all’installazione, concedendo l’accesso senza intervento dell’utente. Nessun elemento dell’interfaccia viene mostrato, nessun callback viene invocato.
Il meccanismo di verifica funziona a livello di PackageManager. Durante l’installazione dell’APK, il sistema scansiona tutti i tag uses-permission, determina il livello di protezione di ogni autorizzazione confrontandolo con le definizioni di sistema nei file permissions.xml, e per il livello normale registra semplicemente l’accesso. Il processo richiede millisecondi e non necessita di interazione con l’interfaccia utente.
L’algoritmo di concessione funziona come segue:
L’utente non può revocare un’autorizzazione normale tramite l’interfaccia. Nelle impostazioni delle applicazioni, nella sezione Autorizzazioni, vengono mostrate solo le autorizzazioni pericolose. Ciò contrasta con iOS, dove ogni autorizzazione richiede una conferma separata indipendentemente dal livello di sensibilità della funzione.
Normal e Dangerous Permission sono due categorie opposte di protezione in Android. La differenza principale è nel metodo di concessione: le normali vengono concesse automaticamente all’installazione, le pericolose richiedono un consenso esplicito tramite un dialogo runtime. Questa distinzione è integrata nell’architettura di sicurezza di Android a partire dalla versione 6.0 Marshmallow.
Confronto delle caratteristiche chiave:
| Caratteristica | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| Richiesta all’utente | Non richiesta | Dialogo runtime obbligatorio |
| Possibilità di revoca | No, solo disinstallazione app | Sì, tramite impostazioni in qualsiasi momento |
| Verifica nel codice | Sempre PERMISSION_GRANTED | checkSelfPermission obbligatorio |
| Esempi | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
L’utente non vede alcun dialogo durante la richiesta di Normal Permission. Se un’app necessita di INTERNET — lo ottiene silenziosamente. Per Dangerous Permission, il sistema mostra un dialogo modale che descrive l’accesso richiesto. L’utente preme Consenti o Nega, e successivamente può revocare l’autorizzazione in qualsiasi momento tramite Impostazioni. Questa è una differenza UX chiave che determina la strategia di sviluppo dell’interfaccia.
Normal dovrebbe essere usato in tutti i casi in cui l’accesso non riguarda dati sensibili. ACCESS_NETWORK_STATE per verificare la connettività, VIBRATE per il feedback aptico, INTERNET per le richieste HTTP — queste sono tutte autorizzazioni normali. Usare il livello dangerous dove normale è sufficiente è una cattiva pratica, creando dialoghi non necessari e riducendo la fiducia dell’utente nell’applicazione.
Android definisce diverse decine di autorizzazioni normali, ciascuna corrispondente a una specifica funzione di sistema. Tutte sono disponibili tramite le costanti della classe Manifest.permission. Di seguito è riportato un elenco delle più comunemente utilizzate nello sviluppo di applicazioni.
| Costante | Accesso | Descrizione |
|---|---|---|
| INTERNET | Rete | Apertura di socket di rete per richieste HTTP |
| ACCESS_NETWORK_STATE | Rete | Ottenimento di informazioni sullo stato della rete |
| ACCESS_WIFI_STATE | Wi-Fi | Lettura di informazioni sulle connessioni Wi-Fi |
| VIBRATE | Vibrazione | Controllo del vibratore del dispositivo |
| BLUETOOTH | Bluetooth | Connessione a dispositivi Bluetooth |
| WAKE_LOCK | Alimentazione | Impedire al processore di entrare in sospensione |
| SET_ALARM | Sveglia | Impostazione di una sveglia tramite AlarmManager |
| CHANGE_NETWORK_STATE | Rete | Modifica dello stato della connessione di rete |
Le autorizzazioni normali non sono raggruppate in Permission Group per scopi di visualizzazione nell’interfaccia. I gruppi in Android sono destinati alla schermata delle impostazioni, dove vengono mostrate solo le autorizzazioni pericolose. Tuttavia, le autorizzazioni normali possono essere logicamente suddivise in categorie: rete (INTERNET, ACCESS_NETWORK_STATE), hardware (VIBRATE, WAKE_LOCK), sistema (SET_ALARM) e autorizzazioni Bluetooth.
Alcune costanti di Manifest.permission possono cambiare il loro livello di protezione su diverse versioni di Android. Ad esempio, BLUETOOTH_CONNECT su Android 12+ è diventata un’autorizzazione pericolosa con richiesta runtime, mentre su versioni più vecchie era normale. Si consiglia agli sviluppatori di verificare il protectionLevel corrente per l’API target tramite la documentazione.
Uno sviluppatore può verificare programmaticamente se un’autorizzazione è normale tramite PackageManager. Il metodo getPermissionInfo restituisce PermissionInfo il cui campo protectionLevel contiene il flag PermissionInfo.PROTECTION_NORMAL. Ciò è utile per la gestione dinamica e il debugging.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Dichiarare Normal Permission in AndroidManifest.xml è l’operazione più semplice, che richiede un solo tag uses-permission. Non è necessaria alcuna configurazione aggiuntiva di protectionLevel, poiché il livello di protezione è determinato dalla definizione di sistema, non dal manifest dell’applicazione. Lo sviluppatore specifica semplicemente il nome completo della costante.
<!-- 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" />
Il sistema elabora tutte le dichiarazioni all’installazione. Se almeno una delle autorizzazioni dichiarate ha un protectionLevel diverso da normal, sarà necessaria una richiesta runtime. INTERNET è l’autorizzazione normale più popolare, presente nella maggior parte delle applicazioni Android, specialmente quelle che effettuano richieste HTTP o caricano contenuti dalla rete.
Un esempio completo di AndroidManifest.xml con autorizzazioni normali e pericolose dimostra la differenza: sintatticamente i tag uses-permission sono identici, ma in fase di esecuzione INTERNET e VIBRATE verranno concessi automaticamente, mentre CAMERA richiederà un dialogo.
<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>
Quando si utilizzano librerie — Google Play Services, Firebase, Glide — queste possono aggiungere i propri uses-permission al manifest finale tramite Manifest Merger. Alcune sono normali (INTERNET per Firebase), altre pericolose (ACCESS_FINE_LOCATION per Google Maps). Lo sviluppatore dovrebbe verificare il manifest unito finale in build/outputs/logs/manifest-merger-report.txt prima della pubblicazione.
Normal Permission ha due limitazioni fondamentali: l’impossibilità di revoca da parte dell’utente e l’assenza di un’interfaccia di gestione. Se l’utente non si fida dell’applicazione ma l’autorizzazione normale è già stata concessa automaticamente — l’unica soluzione è disinstallare l’applicazione. Ciò crea un certo rischio, poiché le autorizzazioni normali non possono essere bloccate con i mezzi standard di Android.
Una limitazione aggiuntiva si manifesta sui dispositivi con più profili (Work Profile, Multiple Users). Normal Permission viene concessa a tutti i profili contemporaneamente — l’applicazione non può limitare l’autorizzazione a uno solo. Negli scenari aziendali, ciò viene risolto tramite Managed Configurations.
Non è possibile verificare se un’applicazione sta utilizzando una Normal Permission in un dato momento. Il metodo di sistema checkSelfPermission funziona solo per le autorizzazioni pericolose. Per quelle normali restituisce sempre PERMISSION_GRANTED, che non riflette l’attività reale. Ciò dovrebbe essere considerato durante gli audit di sicurezza e l’analisi del comportamento dell’applicazione.
Vale anche la pena ricordare che alcuni produttori di dispositivi (Xiaomi, Huawei, Samsung) modificano il comportamento standard delle autorizzazioni. Sul loro firmware, Normal Permission potrebbe richiedere autorizzazioni aggiuntive nell’interfaccia proprietaria MIUI o EMUI. Si consiglia agli sviluppatori di testare su dispositivi reali di diversi produttori.
Domande frequenti
Normal Permission viene concessa automaticamente all’installazione senza dialogo. Dangerous richiede una richiesta runtime con il consenso esplicito dell’utente e può essere revocata tramite impostazioni. Normal utilizza ProtectionLevel normal, Dangerous protectionLevel dangerous.
No, per le autorizzazioni normali è sufficiente dichiarare uses-permission in AndroidManifest.xml. Non è richiesto codice di richiesta — il sistema concede l’accesso automaticamente. Questo le distingue da quelle pericolose, dove è necessario ActivityCompat.requestPermissions.
Le più utilizzate: INTERNET (richieste di rete), ACCESS_NETWORK_STATE (verifica connettività), VIBRATE (feedback aptico) e WAKE_LOCK (mantenere il processore attivo). Praticamente ogni applicazione Android utilizza almeno INTERNET.
No, Normal Permission non può essere revocata tramite le impostazioni dell’applicazione. L’unico modo per interrompere l’accesso è disinstallare l’applicazione. Questa è una differenza chiave rispetto alle autorizzazioni pericolose, che l’utente può disabilitare in qualsiasi momento.
Utilizza PackageManager.getPermissionInfo, passando il nome dell’autorizzazione come stringa. Il metodo restituisce PermissionInfo con un campo protectionLevel. Confrontalo con le costanti PermissionInfo.PROTECTION_NORMAL o PROTECTION_DANGEROUS per determinare la categoria.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche