22

我正在尝试设置一个文件提供程序来共享文件。我的文件保存在外部存储中的文件夹“AppName”中(与 Android、电影和图片文件夹相同级别)。

这是我的文件提供程序配置:

<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>

和 file_paths.xml :

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

当我尝试使用以下方式访问我的文件时:

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

它返回一个错误:java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/AppName/IMG_20160419_095211.jpg at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678 ) 在 android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377)

在我使用图片或电影等内置目录之前,它工作正常,我的 file_paths.xml 定义如下:

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

但现在我想将我的文件存储在我自己的文件夹中。我错过了 FileProvider 配置的内容吗?

4

8 回答 8

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

表示应用程序内部存储区域的 files/ 子目录中的文件。该子目录与 Context.getFilesDir() 返回的值相同。

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

表示外部存储区域根目录中的文件。该子目录的根路径与 Environment.getExternalStorageDirectory() 返回的值相同。

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

代表应用程序外部存储区域根目录中的文件。该子目录的根路径与 Context#getExternalFilesDir(String) Context.getExternalFilesDir(null) 返回的值相同。

有关更多详细信息,请查看Android 的 FileProvider 文档。一些配置如下图,com.view.asim.enterprise 是我的包名。 在此处输入图像描述

于 2018-10-16T01:33:36.127 回答
9
<?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>
于 2018-10-29T12:24:11.170 回答
9

首先,我知道这是一篇旧帖子,但它是与我的问题相似的最接近的问题,所以我将发布我的解决方案。

该错误的原因是因为您在提供程序文件中提供的路径是

  • a) 拼写错误且不存在于external-path
  • b) 使用/storage/emulated/0绝对路径

它返回Failed to find configured root that contains ...是因为它找不到该文件夹​​。因此,请确保只编写要共享的目录,并确保拼写正确。请记住,当您声明external-path它是调用的等价物时,Enviornment.getExternalStorageDirectory()由于您在创建文件时编写了目录的名称,因此您不需要在提供path程序文件中提供 a ,因为它所做的只是掩盖路径中的任何值名字。

因此,您的提供者路径将是: <external-path name="my_files" />

你的代码是:

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

然后,您的 uri 路径将产生以下内容

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

如果您在提供程序文件中提供了路径,那么您的 uri 路径将如下所示:

content://fileprovider/my_files/file.ext

于 2017-01-24T22:08:05.870 回答
4

我修好了它

<!--THIS IS EVIL-->
    <root-path
        name="sdcard1"
        path="." />
于 2018-02-21T06:37:08.107 回答
2

文件提供程序
java.lang.IllegalArgumentException:无法找到包含的配置根目录 这是由于在清单中声明的​​ fileprovider_path.xml 中正确配置了路径。 是否可能是图像路径外部文件路径等,如前所述声明。

<?xml version="1.0" encoding="utf-8"?>
    <paths>
      <external-path
        name="external"
        path="." />
      <external-files-path
        name="external_files"
        path="." />
    <files-path
        name="files"
        path="." />
    </paths>
于 2020-02-08T12:34:50.607 回答
1

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

name="mypath" - mypath 必须是您的图像文件名中的特定部分,如果您的所有图像文件的名称中都包含“IMG”,则说 name="IMG" 将起作用,根据您的示例代码判断,这里就是这种情况。

path="AppName" 是您在外部为图像创建的文件夹名称,最后需要“/”,即 path="AppName/"

所以,<external-path name="IMG" path="AppName/" />应该这样做,当您使用 FileProvider.getUriForFile() 请求 Uri 时,FileProvider 应该找到并让其他应用程序访问您的图像。

希望能帮助到你。

于 2018-10-25T17:13:08.753 回答
1

我有同样的事情。就我而言,每次修改“file_paths.xml”中文件提供程序的路径时,我都必须清理 Android Studio 中的构建(构建 > 清洁项目)。

于 2016-05-25T11:47:43.487 回答
0

将您的 xml 路径替换为

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<external-files-path 
name="extfiles" path="."/> </paths>
于 2019-06-24T10:07:32.490 回答