web-dev-qa-db-fra.com

IllegalArgumentException: impossible de trouver la racine de configuration contenant xxx sur FileProvider.getUriForFile

J'ai essayé de suivre le tutoriel Android sur le partage de fichiers . J'ai configuré la FileProvider comme ceci:

Sur le manifeste principal xml:

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

le fichier res/xml/filpaths.xml:

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

Et dans mon code, j'essaie ce qui suit:

File requestFile = new File(mImageFilenames[position]);
                try {
                    fileUri = FileProvider.getUriForFile(
                            SeventhActivity.this,
                            "com.example.mysecondapp.fileprovider",
                            requestFile);
                } catch (IllegalArgumentException e) {
                    Log.e("File Selector",
                            "The selected file can't be shared: " +
                                    mImageFilenames[position]);
                }

Le requestFile est instancié avec un chemin de travail correct pour un fichier . Le chemin de ce fichier commence exactement par ce que getExternalFilesDir(Environment.DIRECTORY_PICTURES) retourne . Je ne peux tout simplement pas comprendre ce qui cause l'erreur car tout semble correspondre . Merci dans avance.

16
Hummus

Le chemin d'accès à ce fichier commence exactement par ce que getExternalFilesDir (Environment.DIRECTORY_PICTURES) renvoie.

Autant que je sache, cela ne vous donnera pas un répertoire nommé SpCars_album/.

Je ne peux tout simplement pas comprendre ce qui cause l'erreur car tout semble correspondre.

Le fichier que vous avez fourni ne peut pas être servi par la variable FileProvider à partir de vos racines définies. 


METTRE &AGRAVE; JOUR

J'ai oublié que cela est lié à un bogue de documentation sur FileProvider . FileProvider et <external-path> servent PAS des fichiers provenant de getExternalFilesDir(), mais plutôt de Environment.getExternalStorageDirectory(). J'ai créé une sous-classe StreamProvider qui offre un support pour getExternalFilesDir() .

Si vous utilisez ma StreamProvider en remplaçant votre <external-path> par <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />, vous devriez avoir plus de chance.

23
CommonsWare

C'est une vieille question maintenant, mais je viens d'avoir un problème similaire.

Une solution paresseuse que j'ai trouvée consiste simplement à utiliser:

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

Parce que getExternalStorageDirectory renvoie "/ storage/emulated/0 /", le partage/Android (niveau inférieur) permet d'accéder aux fichiers de votre application.

Alternativement, si vous voulez être plus précis, vous pouvez faire ceci:

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />

Cela ne vous semble pas tout à fait correct, mais cela semble fonctionner!

8
eAi

L'ajout de implementation 'com.Android.support:support-v4:28.0.0' dans les dépendances de l'application gradlle a fonctionné dans mon cas. Veuillez modifier la version de la plate-forme SDK (28.0.0 dans mon cas) en conséquence.

0
TA2018