Configurazione della condivisione di file

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: