Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:自定义外部存储文件夹上的文件提供程序_Android_Android Fileprovider - Fatal编程技术网

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"

我正在尝试为共享文件设置文件提供程序。我的文件保存在外部存储器的“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>
它返回一个错误: 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>