Per offrire in modo sicuro un file dalla tua app a un'altra app, devi configurare l'app in modo che
un handle sicuro per il file, sotto forma di URI dei contenuti. Android
Il componente FileProvider
genera URI dei contenuti per
basati su specifiche che fornisci in XML. Questa lezione mostra come aggiungere
implementazione di FileProvider
nella tua app e scoprire come
specificare i file che vuoi offrire ad altre app.
Nota: il corso FileProvider
fa parte della
Libreria AndroidX Core. Per informazioni
sull'inclusione di questa libreria nell'applicazione, vedi
Dichiarare le dipendenze.
Specifica il fileProvider
Per definire un FileProvider
per la tua app è necessario inserire una voce in
del file manifest. Questa voce specifica l'autorità da utilizzare nella generazione degli URI dei contenuti, nonché
il nome di un file XML che specifica le directory che la tua app può condividere.
Il seguente snippet mostra come aggiungere al file manifest
L'elemento <provider>
che specifica
FileProvider
, l'autorità e la
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
da utilizzare per gli URI dei contenuti generati
FileProvider
.
Nell'esempio, l'autorità è com.example.myapp.fileprovider
. Per te
specifica un'autorità composta dall'autorità di controllo dell'app
Valore android:package
con la stringa "fileprovider" aggiunti. Per scoprire di più
sul valore dell'autorità, consulta l'argomento
URI dei contenuti e la documentazione per i
android:authorities
.
L'elemento secondario <meta-data>
di
<provider>
punta a un file XML che specifica le directory da
condividi. L'attributo android:resource
corrisponde al percorso e al nome del file, senza
l'estensione .xml
.I contenuti di questo file sono descritti nella prossima sezione.
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
crea il file filepaths.xml
nell'elemento res/xml/
secondaria del tuo progetto. In questo file, specifica le directory aggiungendo un elemento XML per
ogni directory. Lo snippet che segue mostra un esempio dei contenuti
res/xml/filepaths.xml
. Lo snippet mostra anche come condividere una sottodirectory
della directory files/
nella memoria interna:
<paths> <files-path path="images/" name="myimages" /> </paths>
In questo esempio, il tag <files-path>
condivide le directory all'interno della sezione
directory files/
della memoria interna dell'app. Attributo path
condivide la sottodirectory images/
di files/
. name
indica a FileProvider
di aggiungere il segmento del 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 un
la directory da condividere. Oltre all'elemento <files-path>
, puoi:
utilizzare l'elemento <external-path>
per condividere le directory in un dispositivo di archiviazione esterno, e
L'elemento <cache-path>
per condividere le directory nella cache interna
. Per saperne di più sugli elementi secondari che specificano le directory condivise, consulta
documentazione di riferimento di FileProvider
.
Nota: il file XML è l'unico modo in cui puoi specificare le directory in cui vuoi condividi; 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/
del percorso
memoria interna o per i file nelle sottodirectory di files/
. Quando la tua app genera
un URI contenuti per un file, contiene l'autorità specificata nel
<provider>
elemento (com.example.myapp.fileprovider
),
il percorso myimages/
e il nome del file.
Ad esempio, se definisci un valore FileProvider
secondo
gli snippet di questa lezione e richiederai un URI dei contenuti per il file
default_image.jpg
, FileProvider
restituisce il valore
seguente URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Per ulteriori informazioni correlate, consulta: