Configurazione della condivisione di file

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: