Limitare le interazioni con altre app

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:

  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 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.