Android:自定义外部存储文件夹上的文件提供程序
我正在尝试为共享文件设置文件提供程序。我的文件保存在外部存储器的“AppName”文件夹中(与Android、电影和图片文件夹的级别相同) 以下是我的文件提供程序配置:Android:自定义外部存储文件夹上的文件提供程序,android,android-fileprovider,Android,Android Fileprovider,我正在尝试为共享文件设置文件提供程序。我的文件保存在外部存储器的“AppName”文件夹中(与Android、电影和图片文件夹的级别相同) 以下是我的文件提供程序配置: <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.mydomain.appname.fileprovider" android:exported="false"
<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>
它返回一个错误:
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)
以前,当我使用内置目录(如图片或电影)时,我的文件_paths.xml的定义如下:
<external-path name="photos" path="Pictures" />
<external-path name="videos" path="Movies" />
但是现在我想把我的文件保存在我自己的文件夹里。我错过了FileProvider配置吗?我也错过了。在我的例子中,每次我在“file_paths.xml”中修改文件提供者的路径时,我都必须清理Android Studio中的构建(构建>清理项目)。首先,我知道这是一篇旧文章,但这是与我的问题类似的最接近的问题,所以我将发布我的解决方案 该错误的原因是,您在提供程序文件中提供的路径为
- a) 拼写错误且不存在于
外部路径中
- b) 使用
绝对路径/storage/emulated/0
找不到包含…
的配置根目录,因为它找不到该文件夹。因此,请确保只编写要共享的目录,并确保其拼写正确。请记住,当您声明外部路径时
相当于调用environment.getExternalStorageDirectory()
,因为您在创建文件时写入了目录的名称,您不需要在提供程序文件中提供路径
,因为它所做的只是用名称屏蔽路径中的任何值
因此,您的提供者路径是:
您的代码是:
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
我把它修好了
<!--THIS IS EVIL-->
<root-path
name="sdcard1"
path="." />
表示应用程序内部存储区域的文件/子目录中的文件。此子目录与值相同
由Context.getFilesDir()返回
表示外部存储区域根目录中的文件。根
此子目录的路径与返回的值相同
环境。getExternalStorageDirectory()
表示应用程序外部存储区域根目录中的文件。这个
此子目录的根路径与返回的值相同
Context#getExternalFilesDir(字符串)Context.getExternalFilesDir(null)
有关更多详细信息,请查看。
一些配置如下图所示,com.view.asim.enterprise是我的包名。
在
name=“mypath”-mypath必须是图像文件名中的一个特定部分,如果所有图像文件的名称中都有“IMG”,则可以使用name=“IMG”,根据示例代码判断,这里就是这种情况
path=“AppName”是您在外部为图像创建的文件夹名称,结尾需要“/”,即path=“AppName/”
所以,
应该这样做,当您使用FileProvider.getUriForFile()请求Uri时,FileProvider应该查找并允许其他应用程序访问您的图像
希望能有所帮助。
<?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>
将xml路径替换为
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path
name="extfiles" path="."/> </paths>
文件提供程序
java.lang.IllegalArgumentException:未能找到包含
这是因为在清单中声明的fileprovider\u 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>
问题可能在于文件中的硬编码路径。使用新文件(Environment.getExternalStorageDirectory(),“AppName/IMG\u 20160419\u 095211.jpg”)
看看你是否运气更好。我只是尝试了一下,但它不起作用。什么是fileprovider?在里面content://fileprovider/my_files/file.extThe 必须在下的xml定义中定义“path”元素。要指定根目录,请使用:path=“”。使用Environment.getExternalStorageDirectory()非常重要
而不是以文件开始的硬代码路径://
。我现在使用的是Android P,我得到的路径是content://com.jack.videoeditor.provider/root/storage/emulated/0/Movies/VID-20190621-WA0006.mp4 但是mp4不是在播放器上玩的,请帮我这里,我正在使用它为我工作。。真的很有帮助。非常感谢你,如果像我这样的人是瞎子…请注意外部路径和外部文件路径之间的区别,这很重要!这是一个很好的答案!谢谢路径是我在自己的研究中发现的保持顶级水平的方法。如果您更仔细地查看FileProvider,您将看到从XML读取的路径得到规范化。Lint显示“这里不再允许元素根路径…”,但是如果没有这个,功能将无法工作。邪恶,真邪恶!发布您的配置。你的话没有任何意义
<external-path name="name" path="path" />
<external-files-path name="name" path="path" />
<?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>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path
name="extfiles" path="."/> </paths>
<?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>