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

bud*_*dgw 15 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>
Run Code Online (Sandbox Code Playgroud)

和file_paths.xml:

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

当我尝试访问我的文件时:

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

它返回一个错误:java.lang.IllegalArgumentException:无法在android.support.v4.content.FileProvider $ SimplePathStrategy.getUriForFile(FileProvider.java:678)中找到包含/storage/emulated/0/AppName/IMG_20160419_095211.jpg的已配置根目录)在android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377)

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

<external-path name="photos" path="Pictures" />
<external-path name="videos" path="Movies" />
Run Code Online (Sandbox Code Playgroud)

但现在我想将我的文件存储在我自己的文件夹中.我是否错过了使用FileProvider配置的东西?

Aol*_*phn 17

<files-path name="name" path="path" />  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  • 这对我有用.. 真的很有帮助。非常感谢 (2认同)

Pzt*_*tar 8

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

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

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

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

所以你的提供者路径是: <external-path name="my_files" />

你的代码是:

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

您的uri路径将产生以下结果

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

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

content://fileprovider/my_files/file.ext

  • 必须在&lt;external-path&gt;下的xml定义中定义“ path”元素。要指定根目录,请使用:path =“。 (2认同)

Nul*_*ion 5

<?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>
Run Code Online (Sandbox Code Playgroud)


Mar*_*omp 1

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