Configurer le partage de fichiers

Pour proposer un fichier de votre application à une autre application de manière sécurisée, vous devez configurer votre application pour qu'elle propose un gestionnaire sécurisé au fichier, sous la forme d'un URI de contenu. Le composant FileProvider Android génère des URI de contenu pour les fichiers, en fonction des spécifications que vous fournissez au format XML. Cette leçon vous explique comment ajouter l'implémentation par défaut de FileProvider à votre application et comment spécifier les fichiers que vous souhaitez proposer à d'autres applications.

Remarque:La classe FileProvider fait partie de la bibliothèque principale AndroidX. Pour en savoir plus sur l'inclusion de cette bibliothèque dans votre application, consultez la section Déclarer des dépendances.

Spécifier le FileProvider

La définition d'un FileProvider pour votre application nécessite une entrée dans votre fichier manifeste. Cette entrée spécifie l'autorité à utiliser pour générer des URI de contenu, ainsi que le nom d'un fichier XML spécifiant les répertoires que votre application peut partager.

L'extrait de code suivant montre comment ajouter à votre fichier manifeste l'élément <provider> qui spécifie la classe FileProvider, l'autorité et le nom du fichier 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>

Dans cet exemple, l'attribut android:authorities spécifie l'autorité d'URI que vous souhaitez utiliser pour les URI de contenu générés par FileProvider. Dans cet exemple, l'autorité est com.example.myapp.fileprovider. Pour votre propre application, spécifiez une autorité composée de la valeur android:package de l'application, suivie de la chaîne "fileprovider". Pour en savoir plus sur la valeur "authority", consultez la rubrique URI de contenu et la documentation concernant l'attribut android:authorities.

L'élément enfant <meta-data> de <provider> pointe vers un fichier XML spécifiant les répertoires que vous souhaitez partager. L'attribut android:resource correspond au chemin d'accès et au nom du fichier, sans l'extension .xml. Le contenu de ce fichier est décrit dans la section suivante.

Spécifier des répertoires partageables

Une fois que vous avez ajouté FileProvider au fichier manifeste de votre application, vous devez spécifier les répertoires contenant les fichiers que vous souhaitez partager. Pour spécifier les répertoires, commencez par créer le fichier filepaths.xml dans le sous-répertoire res/xml/ de votre projet. Dans ce fichier, spécifiez les répertoires en ajoutant un élément XML pour chacun d'eux. L'extrait de code suivant vous montre un exemple du contenu de res/xml/filepaths.xml. L'extrait montre également comment partager un sous-répertoire du répertoire files/ dans votre espace de stockage interne:

<paths>
    <files-path path="images/" name="myimages" />
</paths>

Dans cet exemple, la balise <files-path> partage des répertoires dans le répertoire files/ du stockage interne de votre application. L'attribut path partage le sous-répertoire images/ de files/. L'attribut name indique à FileProvider d'ajouter le segment de chemin d'accès myimages aux URI de contenu des fichiers du sous-répertoire files/images/.

L'élément <paths> peut avoir plusieurs enfants, chacun spécifiant un répertoire différent à partager. En plus de l'élément <files-path>, vous pouvez utiliser l'élément <external-path> pour partager des répertoires dans un espace de stockage externe, et l'élément <cache-path> pour partager des répertoires de votre répertoire de cache interne. Pour en savoir plus sur les éléments enfants qui spécifient des répertoires partagés, consultez la documentation de référence sur FileProvider.

Remarque:Le fichier XML est le seul moyen de spécifier les répertoires que vous souhaitez partager. Vous ne pouvez pas ajouter un répertoire par programmation.

Vous avez maintenant une spécification complète d'un FileProvider qui génère des URI de contenu pour les fichiers du répertoire files/ de la mémoire de stockage interne de votre application ou pour les fichiers des sous-répertoires de files/. Lorsque votre application génère un URI de contenu pour un fichier, il contient l'autorité spécifiée dans l'élément <provider> (com.example.myapp.fileprovider), le chemin d'accès myimages/ et le nom du fichier.

Par exemple, si vous définissez un FileProvider conformément aux extraits de code de cette leçon et que vous demandez un URI de contenu pour le fichier default_image.jpg, FileProvider renvoie l'URI suivant :

content://com.example.myapp.fileprovider/myimages/default_image.jpg

Pour en savoir plus, consultez les ressources suivantes: