IllegalArgumentException:在FileProvider.getUriForFile中找不到包含xxx的configuration根

我一直在试图遵循Android教程共享文件。 我这样设置FileProvider

在主要的清单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> 

res / xml / filpaths.xml文件:

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

而在我的代码,我正在尝试以下内容:

 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]); } 

requestFile被实例化为文件的正确工作path。 该文件的path开始与getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回。 我只是不明白是什么引起了错误,因为一切似乎都合适。 提前致谢。

Solutions Collecting From Web of "IllegalArgumentException:在FileProvider.getUriForFile中找不到包含xxx的configuration根"

该文件的path开始与getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回。

AFAIK,这不会给你一个名为SpCars_album/的目录。

我只是不明白是什么引起了错误,因为一切似乎都合适。

您提供的文件不是由FileProvider从您定义的根目录中提供的文件。


UPDATE

我忘记了这与FileProvider上的文档错误有关 。 FileProvider<external-path>不提供来自getExternalFilesDir()文件,而是来自Environment.getExternalStorageDirectory() 。 我创build了一个支持getExternalFilesDir()StreamProvider子类 。

如果你使用我的StreamProvider ,用<external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />replace<external-path> <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" /> ,你应该有更好的运气。

这是一个古老的问题,但我刚刚有一个类似的问题。

我发现一个懒惰的解决scheme是只使用:

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

由于getExternalStorageDirectory返回“/ storage / emulated / 0 /”,共享/ Android(下一级)将允许访问应用中的任何文件。

另外,如果你想更精确,你可以这样做:

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

这感觉不太对劲,但它似乎工作!

如果您不尝试捕捉exception作为FileProvider.getUriFoFile()的IllegalArgumentException,当您运行您的代码时,您也将有此exception。

 try { Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f); } catch (IllegalArgumentException e) { e.printStackTrace(); }