Per offrire in modo sicuro un file della tua app a un'altra app, devi configurare l'app in modo che offra un handle sicuro per il file, sotto forma di URI dei contenuti. Il componente FileProvider
per Android genera URI dei contenuti per i file in base alle specifiche fornite in XML. Questa lezione spiega come aggiungere l'implementazione
predefinita di FileProvider
alla tua app e come
specificare i file che vuoi offrire ad altre app.
Nota: la classe FileProvider
fa parte della AndroidX Core Library. Per informazioni
su come includere questa libreria nell'applicazione, consulta
Dichiarare le dipendenze.
Specifica il FileProvider
La definizione di FileProvider
per la tua app richiede una voce nel
manifest. Questa voce specifica l'autorità da utilizzare per la generazione degli URI dei contenuti, nonché il nome di un file XML che specifica le directory che la tua app può condividere.
Lo snippet seguente mostra come aggiungere al file manifest l'elemento <provider>
che specifica la classe FileProvider
, l'autorità e il nome del file XML:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
In questo esempio, l'attributo android:authorities
specifica l'autorità URI che vuoi utilizzare per gli URI dei contenuti generati da FileProvider
.
Nell'esempio, l'autorità è com.example.myapp.fileprovider
. Per la tua app, specifica un'autorità costituita dal valore android:package
dell'app aggiungendo la stringa "fileprovider". Per scoprire di più sul valore dell'autorità, consulta l'argomento URI di contenuto e la documentazione relativa all'attributo android:authorities
.
L'elemento secondario <meta-data>
di
<provider>
rimanda a un file XML che specifica le directory che vuoi
condividere. L'attributo android:resource
corrisponde al percorso e al nome del file, senza l'estensione .xml
.I contenuti di questo file sono descritti nella sezione successiva.
Specifica le directory condivisibili
Dopo aver aggiunto FileProvider
al file manifest dell'app,
devi specificare le directory contenenti i file che vuoi condividere. Per specificare le directory, inizia creando il file filepaths.xml
nella sottodirectory res/xml/
del tuo progetto. In questo file, specifica le directory aggiungendo un elemento XML per ogni directory. Lo snippet seguente mostra un esempio dei contenuti di
res/xml/filepaths.xml
. Lo snippet mostra inoltre come condividere una sottodirectory
della directory files/
nella tua area di archiviazione interna:
<paths> <files-path path="images/" name="myimages" /> </paths>
In questo esempio, il tag <files-path>
condivide le directory all'interno della directory files/
della memoria interna dell'app. L'attributo path
condivide la sottodirectory images/
di files/
. L'attributo name
indica a FileProvider
di aggiungere il segmento di percorso myimages
agli URI dei contenuti dei file nella sottodirectory files/images/
.
L'elemento <paths>
può avere più elementi secondari, ognuno dei quali specifica una directory
diversa da condividere. Oltre all'elemento <files-path>
, puoi
utilizzare l'elemento <external-path>
per condividere le directory nell'unità di archiviazione esterna e
l'elemento <cache-path>
per condividere le directory nella directory della cache
interna. Per scoprire di più sugli elementi secondari che specificano le directory condivise, consulta la documentazione di riferimento di FileProvider
.
Nota: il file XML è l'unico modo per specificare le directory che vuoi condividere; non puoi aggiungere una directory in modo programmatico.
Ora disponi della specifica completa di un FileProvider
che genera URI dei contenuti per i file che si trovano nella directory files/
della
memoria interna della tua app o per i file nelle sottodirectory di files/
. Quando la tua app genera
un URI di contenuto per un file, contiene l'autorità specificata
nell'elemento <provider>
(com.example.myapp.fileprovider
),
nel percorso myimages/
e nel nome del file.
Ad esempio, se definisci un FileProvider
in base agli
snippet di questa lezione e richiedi un URI dei contenuti per il file
default_image.jpg
, FileProvider
restituisce il
seguente URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Per ulteriori informazioni correlate, consulta: