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 de sorte qu'elle propose un identifiant sécurisé pour ce fichier, sous la forme d'un URI de contenu. Le composant FileProvider d'Android génère des URI de contenu pour les fichiers, en fonction des spécifications que vous fournissez en 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 fournisseur de fichiers

Définir 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 qui spécifie les répertoires que votre application peut partager.

L'extrait de code suivant vous 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 l'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 d'autorité, consultez la rubrique URI de contenu et la documentation de l'attribut android:authorities.

L'élément enfant <meta-data> de <provider> pointe vers un fichier XML qui spécifie les répertoires que vous souhaitez partager. L'attribut android:resource est le chemin d'accès et le 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 qui contiennent 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 chaque répertoire. L'extrait de code suivant vous montre un exemple de 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 au sein du répertoire files/ de la mémoire de 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 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 à partager différent. 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 dans 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 de FileProvider.

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

Vous disposez maintenant d'une spécification complète de 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, elle 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 d'après les extraits 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: