web-dev-qa-db-fra.com

Android: FileProvider sur un dossier de stockage externe personnalisé

J'essaie de configurer un fournisseur de fichiers pour le partage de fichiers. Mes fichiers sont enregistrés dans un dossier "NomApp" du stockage externe (même niveau que les dossiers Android, Films et Images).

Voici la configuration de mon fournisseur de fichiers:

<provider
    Android:name="Android.support.v4.content.FileProvider"
    Android:authorities="com.mydomain.appname.fileprovider"
    Android:exported="false"
    Android:grantUriPermissions="true">
    <meta-data
        Android:name="Android.support.FILE_PROVIDER_PATHS"
        Android:resource="@xml/file_paths"/>
</provider>

et le file_paths.xml:

<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <external-path name="mypath" path="AppName" />
</paths>

Quand j'essaie d'accéder à mon dossier avec:

Uri fileUri = FileProvider.getUriForFile(activity, "com.mydomain.appname.fileprovider",
            new File("/storage/emulated/0/AppName/IMG_20160419_095211.jpg"));

Il renvoie une erreur: Java.lang.IllegalArgumentException: Impossible de trouver la racine configurée contenant /storage/emulated/0/AppName/IMG_20160419_095211.jpg sur Android.support.v4.content.FileProvider $ SimplePathStrategy.getUriForFile (FileProvider.Java:678) sur Android.support.v4.content.FileProvider.getUriForFile (FileProvider.Java:377)

Cela fonctionnait bien avant quand j'utilisais le répertoire intégré comme Images ou Films, mon chemin_fichier.xml était défini comme suit:

<external-path name="photos" path="Pictures" />
<external-path name="videos" path="Movies" />

Mais maintenant, je veux stocker mon fichier dans mon propre dossier. Ai-je oublié quelque chose avec la configuration FileProvider?

11
budgw

Tout d’abord, je sais que c’est un ancien message, mais c’est la question la plus proche qui soit semblable à mon problème, alors je vais poster ma solution. 

La raison de cette erreur est que le chemin que vous indiquez dans le fichier du fournisseur est 

  • a) L'orthographe est incorrecte et n'existe pas dans le external-path
  • b) Utilisation du chemin absolu /storage/emulated/0

Il retourne Failed to find configured root that contains ... car il ne trouve pas ce dossier. Veillez donc à n'écrire que le répertoire que vous souhaitez partager et à l'orthographier correctement. N'oubliez pas que lorsque vous déclarez external-path, c'est l'équivalent de l'appel de Enviornment.getExternalStorageDirectory() puisque vous écrivez le nom du répertoire lors de la création de votre fichier, vous n'avez pas besoin de fournir une path dans votre fichier de fournisseur car il ne masque que la valeur indiquée le chemin avec le nom. 

Donc, votre chemin de fournisseur serait: <external-path name="my_files" />

et votre code serait:

File file = new File(new File(Environment.getExternalStorageDirectory(), "myfolder"), "file.ext");
Uri uri = FileProvider.getUriForFile(context, fileProvider, file);

Votre chemin uri donnerait alors ce qui suit

content://fileprovider/my_files/myfolder/file.ext

Si vous aviez fourni un chemin dans votre fichier de fournisseur, votre chemin uri ressemblerait à ceci:

content://fileprovider/my_files/file.ext

6
Pztar
<files-path name="name" path="path" />  

Représente les fichiers dans le sous-répertoire files/de la zone de stockage interne de votre application. Ce sous-répertoire est identique à la valeur retourné par Context.getFilesDir ().

<external-path name="name" path="path" />

Représente les fichiers à la racine de la zone de stockage externe. La racine Le chemin de ce sous-répertoire est identique à la valeur renvoyée par Environment.getExternalStorageDirectory ().

<external-files-path name="name" path="path" />

Représente les fichiers à la racine de la zone de stockage externe de votre application. Le Le chemin racine de ce sous-répertoire est identique à la valeur renvoyée par Context # getExternalFilesDir (String) Context.getExternalFilesDir (null).

pour plus de détails, veuillez vérifier la documentation de FileProvider pour Android . une configuration comme l'image suivante, com.view.asim.enterprise est le nom de mon paquet .  enter image description here

5
Aolphn
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <!-- FOR SD CARD-->
    <root-path
        name="sdcard1"
        path="." />
</paths>
2

Je l'ai corrigé

<!--THIS IS EVIL-->
    <root-path
        name="sdcard1"
        path="." />
2
Sujith Manjavana

J'avais la même chose. Dans mon cas, je devais nettoyer la construction dans Android Studio (Build> Clean Project) chaque fois que je modifiais le chemin du fournisseur de fichier dans 'file_paths.xml'.

1
Martin Klomp

Dans <external-path name="mypath" path="AppName" />

name = "mypath" - mypath doit être un élément spécifique de votre nom de fichier image, par exemple name = "IMG" fonctionnerait si tous vos fichiers image avaient "IMG" dans leur nom, à en juger par votre exemple de code.

path = "AppName" est un nom de dossier que vous avez créé dans external pour vos images. Il faut "/" à la fin, c'est-à-dire path = "AppName /".

donc, <external-path name="IMG" path="AppName/" /> devrait le faire et FileProvider devrait trouver et laisser les autres applications accéder à vos images lorsque vous demandez Uri avec FileProvider.getUriForFile ().

J'espère que ça aide.

0
Boris Gafurov