Pour proposer de manière sécurisée un fichier de votre appli à une autre appli, vous devez configurer votre appli de sorte qu'elle
un handle sécurisé vers le fichier, sous la forme d'un URI de contenu. Android
Le composant FileProvider
génère des URI de contenu pour
en fonction des spécifications que vous fournissez en XML. Cette leçon vous explique comment ajouter
l'implémentation de FileProvider
dans votre application, et comment
spécifiez les fichiers que vous souhaitez proposer à d'autres applications.
Remarque:La classe FileProvider
fait partie du
Bibliothèque AndroidX Core. Pour plus d'informations
sur l'inclusion de cette bibliothèque dans votre application, consultez
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 vous montre comment ajouter à votre fichier manifeste
L'élément <provider>
spécifiant la
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 le vôtre
de l'application, spécifiez une autorité composée de l'autorité
Valeur android:package
avec la chaîne "fileprovider" qui lui est ajoutée. Pour en savoir plus
sur la valeur "authority", consultez la rubrique
URI de contenu et la documentation relative aux
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
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
qui contiennent les fichiers que vous souhaitez partager. Pour spécifier le paramètre
commencez par créer le fichier filepaths.xml
dans le répertoire res/xml/
.
sous-répertoire 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 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
files/
de la mémoire de stockage interne de votre application. Attribut path
partage le sous-répertoire images/
de files/
. name
indique à FileProvider
d'ajouter le segment de chemin d'accès
myimages
vers les URI de contenu des fichiers du sous-répertoire files/images/
.
L'élément <paths>
peut avoir plusieurs enfants, chacun spécifiant un élément 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
L'élément <cache-path>
pour partager les répertoires de votre cache interne
. Pour en savoir plus sur les éléments enfants spécifiant les répertoires partagés, consultez le
Documentation de référence sur FileProvider
.
Remarque:Le fichier XML est le seul moyen de spécifier les répertoires partager ; vous ne pouvez pas ajouter un répertoire par programmation.
Vous disposez désormais d'une spécification complète pour FileProvider
.
qui génère les URI de contenu des fichiers du répertoire files/
de l'application
la mémoire de stockage interne 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 le
é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 au
dans cette leçon, et vous demandez un URI de contenu pour le fichier
default_image.jpg
, FileProvider
renvoie
URI suivant:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Pour en savoir plus, consultez les ressources suivantes: