Dangerous Permission in Android: cosa sono, elenco dei permessi e richiesta runtime

Autore: IT Sectr Pubblicato: 2026-05-20 Tempo di lettura: 8 min

Dangerous Permission è una categoria di permessi in Android che richiedono il consenso esplicito dell'utente tramite un dialogo runtime durante l'esecuzione dell'applicazione. Secondo la Guida per sviluppatori Android, 2024, i permessi pericolosi hanno ProtectionLevel dangerous e forniscono accesso a dati sensibili: fotocamera, microfono, posizione e contatti. Senza il consenso esplicito dell'utente, l'applicazione non può utilizzare queste funzionalità.

Punti chiave

  • Dangerous Permission — permessi Android con ProtectionLevel dangerous che richiedono una richiesta runtime.
  • La richiesta avviene tramite ActivityCompat.requestPermissions con gestione in onRequestPermissionsResult.
  • L'utente può revocare un permesso pericoloso in qualsiasi momento tramite le Impostazioni dell'applicazione.
  • Prima di richiedere, è necessario verificare lo stato tramite ContextCompat.checkSelfPermission.
  • L'elenco include CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION, READ_CONTACTS e altri.

Cosa sono le Dangerous Permission in Android

Dangerous Permission è una categoria di permessi di sistema Android che forniscono accesso ai dati sensibili dell'utente. A differenza dei permessi normali, i permessi pericolosi non vengono concessi automaticamente durante l'installazione — l'applicazione deve richiederli esplicitamente a runtime tramite il meccanismo introdotto in Android 6.0 Marshmallow (API 23).

La necessità di una richiesta esplicita è dovuta alla natura dei dati che questi permessi proteggono: posizione dell'utente, contatti personali, contenuto della fotocamera e del microfono, cronologia chiamate e SMS. Android considera questi dati come sensibili e richiede che l'utente conceda l'accesso consapevolmente. Secondo Android Privacy Sandbox (2024), gli utenti rifiutano in media circa il 30 percento delle richieste runtime.

Una caratteristica fondamentale di Dangerous Permission è la possibilità di revocarlo in qualsiasi momento. L'utente può andare in Impostazioni — Applicazioni — Permessi e disattivare qualsiasi permesso pericoloso. L'applicazione deve essere pronta al fatto che un permesso precedentemente concesso possa essere revocato in qualsiasi momento senza riavvio.

ProtectionLevel dangerous

Il livello di protezione dangerous è definito nelle definizioni dei permessi di sistema a livello di OS. Quando un'applicazione dichiara uses-permission con questo protectionLevel, il sistema contrassegna il permesso come richiedente una richiesta runtime. A differenza di normal, i permessi dangerous sono sempre visualizzati nell'interfaccia di gestione dei permessi del sistema e possono essere revocati.

Permission Group e Dangerous

Tutti i permessi pericolosi sono raggruppati in Permission Groups per categoria funzionale. Ad esempio, CAMERA e CAMERA2 sono nel gruppo CAMERA, ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION sono nel gruppo LOCATION. Se un utente ha concesso un permesso da un gruppo, i permessi rimanenti dello stesso gruppo vengono concessi automaticamente senza un dialogo aggiuntivo.

Come funziona la richiesta runtime

La richiesta runtime è un meccanismo in cui l'applicazione chiama un'API di sistema per visualizzare un dialogo di richiesta permesso. L'utente vede una finestra modale con il nome del permesso e i pulsanti Consenti e Nega. Dopo la risposta, il sistema chiama il callback onRequestPermissionsResult con il risultato.

Il ciclo completo include tre passaggi: verifica dello stato tramite checkSelfPermission, chiamata di requestPermissions se il permesso non è concesso e gestione del risultato in onRequestPermissionsResult. La verifica dello stato è obbligatoria perché l'utente potrebbe aver revocato il permesso in qualsiasi momento tramite le impostazioni e chiamare una funzione senza verifica comporterà una SecurityException.

kotlin
fun checkAndRequestCameraPermission() {
    when {
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED -> {
            openCamera()
        }
        else -> {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.CAMERA),
                REQUEST_CAMERA_CODE
            )
        }
    }
}

La gestione del risultato avviene in ActivityResultLauncher o onRequestPermissionsResult. L'approccio moderno raccomandato è l'utilizzo di ActivityResultContracts.RequestPermission, che fornisce un'API più pulita senza codici di richiesta espliciti. Questo contratto restituisce un Boolean — se il permesso è stato concesso o meno.

Buone pratiche di richiesta

Richiedete i permessi pericolosi rigorosamente nel contesto dell'utilizzo della funzionalità, non all'avvio dell'applicazione. Se l'utente ha premuto il pulsante della fotocamera — richiedete CAMERA. Se ha aperto una mappa — richiedete LOCATION. Le richieste contestuali ottengono il doppio delle concessioni rispetto alla richiesta di tutti i permessi al primo avvio. Si raccomanda inoltre di non richiedere più di un permesso alla volta in modo che l'utente capisca quale funzionalità necessita dell'accesso.

Elenco dei permessi pericolosi in Android

Android definisce diversi gruppi di permessi pericolosi, ciascuno contenente una o più costanti. L'elenco più completo è disponibile nella classe Manifest.permission. Di seguito sono riportati i gruppi principali e i permessi utilizzati nello sviluppo.

Gruppo Permission GroupPermessiAPI di accesso
CAMERACAMERACamera API, CameraX
LOCATIONACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIONFusedLocationProvider, Geofence
MICROPHONERECORD_AUDIOMediaRecorder, AudioRecord
PHONEREAD_PHONE_STATE, CALL_PHONE, READ_CALL_LOGTelephonyManager
CONTACTSREAD_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTSContactsContract
SMSREAD_SMS, SEND_SMS, RECEIVE_SMSSmsManager
STORAGEREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGEMediaStore, File API
CALENDARREAD_CALENDAR, WRITE_CALENDARCalendarContract

Nuovi permessi in Android 12+

A partire da Android 12, Google ha inasprito i requisiti per alcuni permessi. Ad esempio, BLUETOOTH_CONNECT e BLUETOOTH_SCAN sono diventati pericolosi e richiedono una richiesta runtime. Il permesso BODY_SENSORS_BACKGROUND è stato aggiunto per l'accesso in background ai sensori. Gli sviluppatori devono aggiornare targetSdkVersion e testare le richieste sulle versioni correnti del sistema operativo.

Permessi per Android 13+

Android 13 (API 33) ha introdotto nuovi permessi per le notifiche (POST_NOTIFICATIONS) e i file multimediali (READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO), sostituendo il generale READ_EXTERNAL_STORAGE. Ora l'accesso a foto, video e audio viene richiesto separatamente tramite permessi specializzati senza un unico dialogo.

Dangerous vs Normal Permission

I permessi Dangerous e Normal differiscono fondamentalmente per modalità di concessione, possibilità di revoca e UX. Normal viene concesso automaticamente durante l'installazione, Dangerous richiede un dialogo runtime esplicito. Normal non può essere revocato tramite le impostazioni, Dangerous può essere disattivato in qualsiasi momento. Questa asimmetria crea diversi modelli di sviluppo.

Dal punto di vista del codice, i permessi pericolosi richiedono più lavoro: checkSelfPermission, requestPermissions, gestione del rifiuto. Per quelli normali, basta una riga in AndroidManifest.xml. Tuttavia, Dangerous Permission dà il controllo all'utente, aumentando la fiducia, specialmente per funzionalità sensibili come fotocamera o posizione.

La scelta tra le categorie non spetta allo sviluppatore — è determinata dal sistema. Lo sviluppatore dichiara solo uses-permission e il sistema determina la categoria in base a protectionLevel. Tuttavia, la strategia di richiesta dei permessi pericolosi influisce sull'esperienza utente: dialoghi frequenti o inappropriati abbassano la valutazione dell'applicazione.

Come richiedere i permessi in Kotlin

Il modo moderno per richiedere i permessi in Kotlin è utilizzare ActivityResultContracts.RequestMultiplePermissions o RequestPermission. Questi contratti fanno parte della libreria androidx.activity e forniscono un'API pulita basata su lambda, senza bisogno di sovrascrivere onRequestPermissionsResult.

kotlin
class CameraActivity : AppCompatActivity() {
    private val requestPermissionLauncher =
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()
        ) { isGranted: Boolean ->
            if (isGranted) {
                openCamera()
            } else {
                showPermissionDeniedMessage()
            }
        }

    fun requestCamera() {
        when {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.CAMERA
            ) == PackageManager.PERMISSION_GRANTED ->
                openCamera()
            ActivityCompat.shouldShowRequestPermissionRationale(
                this,
                Manifest.permission.CAMERA
            ) ->
                showRationaleDialog()
            else ->
                requestPermissionLauncher.launch(
                    Manifest.permission.CAMERA
                )
        }
    }
}

Richiedere più permessi contemporaneamente

Quando un'applicazione necessita di più permessi pericolosi contemporaneamente, utilizzate RequestMultiplePermissions. Il contratto restituisce Map<String, Boolean> dove la chiave è il nome del permesso e il valore è il risultato. Questo è utile al primo avvio quando è necessario richiedere CAMERA e RECORD_AUDIO per la registrazione video.

Gestione del primo rifiuto

Se l'utente rifiuta la richiesta, il metodo shouldShowRequestPermissionRationale restituisce true. Questo segnala di mostrare una spiegazione del perché il permesso è necessario. La buona pratica è mostrare un dialogo personalizzato con una spiegazione e un pulsante Riprova. Se l'utente rifiuta nuovamente la richiesta con la casella Never Ask Again selezionata, shouldShowRequestPermissionRationale restituirà false ed è necessario reindirizzare alle Impostazioni.

Gestione del rifiuto e Never Ask Again

Never Ask Again è un flag che l'utente può impostare quando rifiuta il dialogo runtime per la seconda volta. Dopodiché, il dialogo standard non viene più mostrato per quel permesso. L'unico modo per concedere l'accesso è reindirizzare l'utente alle impostazioni di sistema delle applicazioni.

Lo sviluppatore deve distinguere due scenari di rifiuto: primo, quando shouldShowRequestPermissionRationale restituisce true (l'utente ha rifiutato ma il dialogo può ancora essere mostrato), e secondo, quando il metodo restituisce false (Never Ask Again è attivo o il permesso è bloccato da policy). Nel secondo caso, è opportuno mostrare un pulsante Apri Impostazioni.

kotlin
fun handlePermissionDenied(permission: String) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(
            this, permission
    )) {
        showRationaleDialog(permission)
    } else {
        showSettingsRedirectDialog(permission)
    }
}

private fun showSettingsRedirectDialog(permission: String) {
    AlertDialog.Builder(this)
        .setTitle("Accesso negato")
        .setMessage(
            "Permesso bloccato. Apri Impostazioni."
        )
        .setPositiveButton("Impostazioni") { _, _ ->
            val intent = Intent(
                Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                Uri.fromParts(
                    "package", packageName, null
                )
            )
            startActivity(intent)
        }
        .show()
}

È importante non richiedere nuovamente il permesso se shouldShowRequestPermissionRationale ha restituito false. Una chiamata ripetuta a requestPermissions in questo caso non mostrerà alcun dialogo — il risultato arriverà immediatamente con DENIED senza spiegazione. L'utente incontrerà un comportamento poco chiaro, che influisce negativamente sull'esperienza d'uso dell'applicazione.

Domande frequenti

Quali permessi sono considerati pericolosi in Android?

I permessi pericolosi includono i permessi con ProtectionLevel dangerous: CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION, READ_CONTACTS, READ_SMS, READ_CALENDAR e altri. L'elenco completo è disponibile nella classe Manifest.permission.

Come verificare se un permesso pericoloso è concesso?

Utilizzate ContextCompat.checkSelfPermission passando il contesto e il nome del permesso. Il metodo restituisce PERMISSION_GRANTED o PERMISSION_DENIED. La verifica dovrebbe essere eseguita prima di ogni chiamata API che richiede un permesso pericoloso.

Cos'è un Permission Group per i permessi pericolosi?

Un Permission Group raggruppa permessi pericolosi correlati. Se un utente concede un permesso da un gruppo, gli altri vengono concessi automaticamente. Ad esempio, LOCATION include ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION.

Come gestire Never Ask Again?

Verificate shouldShowRequestPermissionRationale dopo il rifiuto. Se il metodo restituisce false e il permesso non è ancora concesso — Never Ask Again è attivo. Reindirizzate l'utente alle Impostazioni tramite Intent con ACTION_APPLICATION_DETAILS_SETTINGS.

I permessi pericolosi sono necessari su Android 13+?

Sì, rimangono obbligatori. Su Android 13+, alcuni permessi sono cambiati: POST_NOTIFICATIONS è diventato un permesso runtime separato e READ_EXTERNAL_STORAGE è stato sostituito da READ_MEDIA_IMAGES per l'accesso granulare ai file multimediali.

Riepilogo

  • Dangerous Permission — permessi Android con ProtectionLevel dangerous che richiedono una richiesta runtime esplicita dall'utente.
  • Il meccanismo include tre passaggi: checkSelfPermission, requestPermissions e onRequestPermissionsResult.
  • L'utente può revocare un permesso pericoloso in qualsiasi momento tramite le impostazioni di sistema.
  • Gruppi principali: CAMERA, LOCATION, MICROPHONE, PHONE, CONTACTS, SMS, STORAGE, CALENDAR.
  • ActivityResultContracts.RequestPermission è l'API moderna per richiedere in Kotlin senza codici di richiesta.
  • ShouldShowRequestPermissionRationale aiuta a distinguere tra primo rifiuto e Never Ask Again.
  • Su Android 13+ sono apparsi nuovi permessi: POST_NOTIFICATIONS e READ_MEDIA_IMAGES in sostituzione di STORAGE.

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.

Discuti il progetto

Leggi anche