Per offrire in modo sicuro un file dalla tua app a un'altra app, devi configurare la tua app in modo che offra un handle sicuro al file, sotto forma di URI dei contenuti. Il componente Android
FileProvider
genera URI dei contenuti per
i file in base alle specifiche fornite in XML. Questa lezione mostra come aggiungere l'implementazione
predefinita di FileProvider
alla tua app e come
specificare i file da offrire ad altre app.
Nota: il corso FileProvider
fa parte della libreria AndroidX Core. Per informazioni su come includere questa libreria nell'applicazione, consulta Dichiarare le dipendenze.
Specifica il fileProvider
La definizione di un FileProvider
per la tua app richiede una voce nel
file manifest. Questa voce specifica l'autorità da utilizzare per generare gli URI dei contenuti, nonché il nome di un file XML che specifica le directory che l'app può condividere.
Lo snippet seguente mostra come aggiungere al tuo 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 con la stringa "fileprovider" aggiunta. Per scoprire di più sul valore dell'autorità, consulta l'argomento URI dei contenuti e la documentazione relativa all'attributo android:authorities
.
L'elemento secondario <meta-data>
di <provider>
fa riferimento a un file XML che specifica le directory da 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 directory condivisibili
Dopo aver aggiunto FileProvider
al file manifest dell'app, devi specificare le directory che contengono i file che vuoi condividere. Per specificare le
directory, crea il file filepaths.xml
nella sottodirectory
res/xml/
del tuo progetto. In questo file, specifica le directory aggiungendo un elemento XML per ogni directory. Il seguente snippet mostra un esempio dei contenuti di res/xml/filepaths.xml
. Lo snippet mostra anche come condividere una sottodirectory
della directory files/
nell'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/
dello spazio di archiviazione interno 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 per i 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 in una memoria 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 da condividere; non puoi aggiungere una directory in modo programmatico.
Ora hai una specifica completa di FileProvider
che genera URI dei contenuti per i file nella directory files/
della memoria interna dell'app o per i file nelle sottodirectory di files/
. Quando l'app genera un URI dei contenuti per un file, contiene l'autorità specificata nell'elemento <provider>
(com.example.myapp.fileprovider
), il percorso myimages/
e il 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: