Configurazione della condivisione di file

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: