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

Hum*_*mus 16 android filepath illegalargumentexception android-fileprovider

我一直在尝试按照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>
Run Code Online (Sandbox Code Playgroud)

res/xml/filpaths.xml文件:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="myexternalimages" path="SpCars_album/" />
</paths>
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我尝试以下方法:

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]);
                }
Run Code Online (Sandbox Code Playgroud)

requestFile使用适当的文件工作路径进行实例化.该文件的路径完全以getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回的内容开始.我只是无法理解是什么引起了错误,因为一切似乎都适合.提前致谢.

Com*_*are 23

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

AFAIK,它不会给你一个名为的目录SpCars_album/.

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

您提供的文件不是FileProvider可由您定义的根提供的文件.


UPDATE

我忘了这与文档错误有关FileProvider.FileProvider<external-path>没有为来自文件getExternalFilesDir(),而是从Environment.getExternalStorageDirectory().我创建了一个StreamProvider支持的子类getExternalFilesDir().

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


eAi*_*eAi 8

现在这是一个老问题,但我刚遇到了类似的问题.

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

<external-path name="myexternalimages" path="Android/" />
Run Code Online (Sandbox Code Playgroud)

因为getExternalStorageDirectory返回"/ storage/emulated/0 /",所以共享/ Android(下一级别)将允许访问应用程序中的任何文件.

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

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />
Run Code Online (Sandbox Code Playgroud)

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