Android:自定义外部存储文件夹

时间:2016-05-06 14:24:19

标签: android android-fileprovider

我正在尝试设置一个用于共享文件的fileprovider。我的文件保存在外部存储器的“AppName”文件夹中(与Android,Movies和Pictures文件夹相同)。

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

<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异常: 无法找到包含/storage/emulated/0/AppName/IMG_20160419_095211.jpg的已配置根目录                                                                          在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配置的东西?

8 个答案:

答案 0 :(得分:10)

<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's doc of FileProvider。 像下面的图片这样的一些配置,com.view.asim.enterprise是我的软件包名称。 enter image description here

答案 1 :(得分:8)

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

出现此错误的原因是您在提供程序文件中提供的路径是

  • a)拼写不正确,external-path
  • 中不存在
  • b)使用/storage/emulated/0绝对路径

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

所以你的提供者路径是: <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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我修好了

<!--THIS IS EVIL-->
    <root-path
        name="sdcard1"
        path="." />

答案 4 :(得分: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>

答案 5 :(得分:1)

我有同样的事情。在我的情况下,每次修改文件提供者的路径时,我都必须清理Android Studio中的构建(Build&gt; Clean Project)。

答案 6 :(得分:0)

<div class='container'> <div class='header'></div> <div class='content' ></div> </div>

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

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

因此,<external-path name="mypath" path="AppName" />应该这样做,并且FileProvider应该在您通过FileProvider.getUriForFile()请求Uri时找到并允许其他应用访问您的图像。

希望有帮助。

答案 7 :(得分:0)

替换为您的xml路径

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