Limitare le interazioni con altre app

Le autorizzazioni non servono solo per richiedere funzionalità del sistema. Puoi anche limitare il modo in cui altre app possono interagire con i componenti dell'app.

Questa guida spiega come verificare l'insieme di autorizzazioni dichiarate da un'altra app. La guida spiega inoltre come configurare attività, servizi, fornitori di contenuti e ricevitori di trasmissioni 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:

  1. Apri la schermata Informazioni app di un'app.
  2. Seleziona Autorizzazioni. Viene caricata la schermata Autorizzazioni app.

    Questa schermata mostra un insieme di gruppi di autorizzazioni. Il sistema organizza l'insieme di autorizzazioni che un'app ha dichiarato in questi gruppi.

Esistono molti altri modi utili per controllare le autorizzazioni:

  • Durante una chiamata in 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 attuale. Tieni presente che questo può essere utilizzato solo quando esegui una chiamata in entrata da un altro processo, in genere tramite un'interfaccia IDL pubblicata da un servizio o in qualche altro modo fornita a un altro processo.
  • Per verificare se a un altro processo è stata concessa un'autorizzazione specifica, passa il processo (PID) in Context.checkPermission().
  • Per verificare se a un altro pacchetto è stata concessa un'autorizzazione specifica, passa il nome del pacchetto in PackageManager.checkPermission().

Limitare le interazioni con le attività della tua app

Utilizza l'attributo android:permission al tag <activity> nel file manifest per limitare le altre app che possono avviare lo stesso 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 dell'app

Utilizza l'attributo android:permission al tag <service> nel file manifest per limitare le altre app che possono essere avviate o associate all'elemento 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 dell'app

Utilizza l'attributo android:permission al 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 che segue. A differenza degli altri componenti, esistono due attributi di autorizzazione separati che puoi impostare per i fornitori di contenuti: android:readPermission limita le altre app che possono leggere dal provider e android:writePermission limita le altre app che possono scrivere su quest'ultima. Tieni presente che se un provider è protetto sia con un'autorizzazione di lettura che con una scrittura, possedere solo l'autorizzazione di scrittura non consente a un'app di leggere da un provider.

Le autorizzazioni vengono verificate al primo recupero del provider e quando un'app esegue operazioni sul provider. Se l'app richiedente non dispone di alcuna autorizzazione, si verifica un SecurityException. L'utilizzo di ContentResolver.query() richiede l'autorizzazione di lettura; per l'utilizzo di ContentResolver.insert(), ContentResolver.update() o ContentResolver.delete() è necessaria l'autorizzazione di scrittura. In tutti questi casi, se non conservi l'autorizzazione richiesta, verrà restituito un SecurityException.

Concedi l'accesso in base a URI

Il sistema ti offre un controllo aggiuntivo e granulare sul modo in cui altre app possono accedere ai fornitori di contenuti delle tue app. In particolare, il tuo provider di contenuti può proteggersi con autorizzazioni di lettura e scrittura consentendo comunque ai suoi client 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. Questo concede ad altre app le autorizzazioni di lettura, scrittura o lettura/scrittura, rispettivamente, per l'URI dei dati incluso nell'intent. Altre app ottengono queste autorizzazioni per l'URI specifico indipendentemente dal fatto che siano autorizzate ad accedere ai dati del fornitore di contenuti in modo più generico.

Ad esempio, supponiamo che un utente utilizzi la tua app per visualizzare un'email con un'immagine allegata. Altre app non dovrebbero riuscire ad accedere ai contenuti dell'email in generale, ma potrebbero essere interessate a visualizzare l'immagine. La tua app può utilizzare un intent e il flag Intent.FLAG_GRANT_READ_URI_PERMISSION intent per consentire a un'app di visualizzazione di immagini di vedere l'immagine.

Un altro fattore da considerare è la visibilità dell'app. Se la tua app ha come target Android 11 (livello API 30) o versioni successive, il sistema rende automaticamente visibili alcune app nella tua app e le nasconde per impostazione predefinita. Se la tua app dispone di un provider di contenuti e ha concesso autorizzazioni URI a un'altra app, l'app è visibile automaticamente per l'altra app.

Per ulteriori informazioni, consulta il materiale di riferimento per i metodi grantUriPermission(), revokeUriPermission() e checkUriPermission().

Limitare le interazioni con i ricevitori della tua app

Utilizza l'attributo android:permission al tag <receiver> per limitare le altre app che possono inviare broadcast al BroadcastReceiver associato. L'autorizzazione viene selezionata dopo il ritorno di Context.sendBroadcast(), poiché il sistema tenta di inviare la trasmissione inviata al destinatario specificato. Ciò significa che un errore di autorizzazione non comporta la restituzione di un'eccezione al chiamante, semplicemente non restituisce Intent.

Allo stesso modo, puoi fornire un'autorizzazione a Context.registerReceiver() per controllare quali altre app possono trasmettere a un ricevitore registrato in modo programmatico. Viceversa, puoi fornire un'autorizzazione durante la chiamata a Context.sendBroadcast() per limitare i ricevitori che possono ricevere la trasmissione.

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 consegnato alla destinazione associata. Per maggiori informazioni, consulta Limitare le trasmissioni con autorizzazioni.