Le autorizzazioni non servono solo per richiedere funzionalità di sistema. Puoi anche limitare il modo in cui altre app possono interagire con i componenti della tua app.
Questa guida spiega come controllare l'insieme di autorizzazioni dichiarate da un'altra app. La guida spiega anche come configurare attività, servizi, content provider e ricevitori di trasmissione per limitare il modo in cui altre app possono interagire con la tua app.
Controllare le autorizzazioni di un'altra app
Per visualizzare l'insieme di autorizzazioni dichiarate da un'altra app, utilizza un dispositivo o un emulatore per completare i seguenti passaggi:
- Apri la schermata Informazioni app di un'app.
- Seleziona Autorizzazioni Viene caricata la schermata Autorizzazioni app. - Questa schermata mostra un insieme di gruppi di autorizzazioni. Il sistema organizza l'insieme di autorizzazioni dichiarate da un'app in questi gruppi. 
Esistono diversi altri modi utili per controllare le autorizzazioni:
- Per controllare un'autorizzazione durante una chiamata a un servizio, passa una stringa di autorizzazione
in Context.checkCallingPermission(). Questo metodo restituisce un numero intero che indica se l'autorizzazione è stata concessa al processo di chiamata corrente. Tieni presente che questa opzione può essere utilizzata solo quando esegui una chiamata proveniente da un altro processo, di solito tramite un'interfaccia IDL pubblicata da un servizio o fornita in altro modo a un altro processo.
- Per verificare se a un altro processo è stata concessa una determinata autorizzazione,
trasferisci l'ID processo (PID) in Context.checkPermission().
- Per verificare se a un altro pacchetto è stata concessa una determinata autorizzazione,
trasmetti il nome del pacchetto a PackageManager.checkPermission().
Limitare le interazioni con le attività della tua app
Nel manifest, utilizza l'attributo android:permission del tag <activity>
per limitare le altre app che possono avviare l'Activity. L'autorizzazione
viene controllata durante Context.startActivity() e
Activity.startActivityForResult(). Se il chiamante non dispone dell'autorizzazione
richiesta, si verifica un SecurityException.
Limitare le interazioni con i servizi della tua app
Nel manifest, utilizza l'attributo android:permission del tag <service>
per limitare le altre app che possono avviare o collegarsi all'Service associato. L'autorizzazione viene controllata durante
Context.startService(), Context.stopService() e
Context.bindService(). Se il chiamante non dispone dell'autorizzazione
richiesta, si verifica un SecurityException.
Limitare le interazioni con i fornitori di contenuti della tua app
Nel manifest, utilizza l'attributo android:permission del tag <provider>
per limitare le altre app che possono accedere ai dati in un ContentProvider.
I fornitori di contenuti hanno a disposizione un'importante funzionalità di sicurezza aggiuntiva chiamata autorizzazioni URI, descritta nella sezione seguente.
A differenza degli altri componenti, per i content provider puoi impostare due attributi di autorizzazione separati: android:readPermission limita le app che possono leggere dal provider e android:writePermission limita le app che possono scrivere al suo interno. Tieni presente che se un provider è protetto
sia da un'autorizzazione di lettura che di scrittura, il possesso della sola autorizzazione di scrittura non
consente a un'app di leggere da un provider.
Le autorizzazioni vengono verificate al primo recupero del fornitore e quando un'app
esegue operazioni sul fornitore. Se l'app richiedente non dispone di alcuna
autorizzazione, si verifica un SecurityException. L'utilizzo di ContentResolver.query()
richiede l'autorizzazione di lettura; l'utilizzo di ContentResolver.insert(),
ContentResolver.update() o ContentResolver.delete() richiede
l'autorizzazione di scrittura. In tutti questi casi, il mancato possesso dell'autorizzazione richiesta
comporta un SecurityException.
Concedere l'accesso in base all'URI
Il sistema ti offre un controllo più dettagliato su come altre app
possono accedere ai content provider della tua app. In particolare, il tuo fornitore di contenuti
può proteggersi con autorizzazioni di lettura e scrittura, consentendo comunque ai suoi
clienti diretti di condividere URI specifici con altre app. Per dichiarare il supporto della tua app per questo modello, utilizza l'attributo android:grantUriPermissions o l'elemento <grant-uri-permission>.
Puoi anche concedere le autorizzazioni in base all'URI. Quando avvii un'attività o
restituisci un risultato a un'attività, imposta il
flag di intent Intent.FLAG_GRANT_READ_URI_PERMISSION, il
flag di intent Intent.FLAG_GRANT_WRITE_URI_PERMISSION o entrambi i flag. In questo modo,
le altre app ricevono rispettivamente le autorizzazioni di lettura, scrittura o lettura e scrittura per
l'URI dei dati incluso nell'intent. Altre app ottengono queste autorizzazioni
per l'URI specifico, indipendentemente dal fatto che abbiano l'autorizzazione ad accedere ai dati
nel content provider in modo più generale.
Ad esempio, supponiamo che un utente stia utilizzando la tua app per visualizzare un'email con un
allegato immagine. In generale, altre app non dovrebbero essere in grado di accedere ai contenuti dell'email, ma potrebbero essere interessate a visualizzare l'immagine. La tua app può utilizzare un intent e il flag di intent Intent.FLAG_GRANT_READ_URI_PERMISSION per consentire a un'app di visualizzazione delle immagini di vedere l'immagine.
Un'altra considerazione riguarda la visibilità dell'app. Se la tua app ha come target Android 11 (livello API 30) o versioni successive, il sistema rende visibili alcune app alla tua app automaticamente e nasconde altre app per impostazione predefinita. Se la tua app ha un fornitore di contenuti e ha concesso autorizzazioni URI a un'altra app, la tua app è visibile automaticamente a quest'altra app.
Per saperne di più, consulta il materiale di riferimento per i metodi
grantUriPermission(), revokeUriPermission() e
checkUriPermission().
Limitare le interazioni con i broadcast receiver della tua app
Utilizza l'attributo android:permission del tag <receiver> per
limitare le altre app che possono inviare trasmissioni all'BroadcastReceiver associato. Il sistema controlla l'autorizzazione dopo
il ritorno di Context.sendBroadcast(), poiché tenta di inviare la
trasmissione inviata al destinatario specificato. Ciò significa che un errore di autorizzazione non comporta la generazione di un'eccezione per il chiamante, ma semplicemente non viene restituito il Intent.
Puoi anche configurare le autorizzazioni a livello di programmazione:
- Per controllare quali altre app possono trasmettere a un ricevitore registrato
in modo programmatico: fornisci un'autorizzazione a
Context.registerReceiver().
- Per limitare i ricevitori di trasmissione che possono ricevere una trasmissione: fornisci un'autorizzazione quando chiami Context.sendBroadcast().
Tieni presente che sia un ricevitore che un emittente possono richiedere un'autorizzazione. In questo caso, entrambi i controlli delle autorizzazioni devono essere superati affinché l'intent venga inviato alla destinazione associata. Per ulteriori informazioni, vedi Limitare le trasmissioni con le autorizzazioni.
