我正在尝试设置一个用于共享文件的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配置的东西?
答案 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是我的软件包名称。
答案 1 :(得分:8)
首先,我知道这是一个旧帖子,但它是最接近的问题,与我的问题类似,所以我会发布我的解决方案。
出现此错误的原因是您在提供程序文件中提供的路径是
external-path
/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>