IllegalArgumentException:无法在FileProvider.getUriForFile上找到包含xxx的配置根

时间:2013-12-08 15:21:25

标签: android filepath illegalargumentexception android-fileprovider

我一直在尝试关注共享文件的Android tutorial。 我像这样设置了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使用适当的文件工作路径进行实例化。 该文件的路径始于getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回的内容。 我只是无法理解是什么引起了错误,因为一切似乎都适合。 提前谢谢。

4 个答案:

答案 0 :(得分:23)

  

该文件的路径完全以getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回的内容开始。

AFAIK,它不会为您提供名为SpCars_album/的目录。

  

我只是无法理解是什么引起了错误,因为一切似乎都适合。

您提供的文件不是FileProvider来自您定义的根目录的文件。


<强>更新

我忘了这与a documentation bug on FileProvider有关。 FileProvider<external-path> 提供来自getExternalFilesDir()的文件,而不是来自Environment.getExternalStorageDirectory()。我创建了a StreamProvider subclass that offers support for getExternalFilesDir()

如果您使用我的StreamProvider,将<external-path>替换为<external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />,您应该会有更好的运气。

答案 1 :(得分:8)

现在这是一个老问题,但我也有类似的问题。

我找到的一个懒惰的解决方案就是使用:

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

因为getExternalStorageDirectory返回&#34; / storage / emulated / 0 /&#34;,共享/ Android(下一级别)将允许访问您应用中的任何文件。

或者,如果您想更精确,可以这样做:

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

这感觉不太对劲,但似乎确实有效!

答案 2 :(得分:0)

在我的案例中,将implementation 'com.android.support:support-v4:28.0.0'添加到应用gradlle依赖关系中是可行的。 请相应更改SDK平台版本(在我的情况下为28.0.0)。

答案 3 :(得分:-8)

如果您没有尝试捕获异常,因为FileProvider.getUriFoFile()的IllegalArgumentException,当您运行代码时,您也会遇到此异常。

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