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: