当前位置: 首页 > 知识库问答 >
问题:

Android:自定义外部存储文件夹上的文件提供程序

虞唯
2023-03-14

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

以及文件路径。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的配置根目录。Android的jpg。支持v4。所容纳之物FileProvider$SimplePathStrategy。android上的getUriForFile(FileProvider.java:678)。支持v4。所容纳之物文件提供者。getUriForFile(FileProvider.java:377)

以前,当我使用内置目录(如图片或电影、文件路径)时,它工作得很好。xml的定义如下:

<external-path name="photos" path="Pictures" />
<external-path name="videos" path="Movies" />

但是现在我想把我的文件存储在我自己的文件夹里。我错过了文件提供商配置的东西吗?

共有3个答案

罗允晨
2023-03-14
<?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>
杨无尘
2023-03-14

首先,我知道这是一篇老文章,但这是与我的问题相似的最接近的问题,所以我将发布我的解决方案。

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

  • a) 拼写错误且不存在于外部路径中

它返回找不到已配置的根目录,该根目录包含 因为它找不到该文件夹。因此,请确保只编写要共享的目录,并确保其拼写正确。请记住,当您声明外部路径时,它等同于调用环境。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

阳长恨
2023-03-14
<files-path name="name" path="path" />  

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

<external-path name="name" path="path" />

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

<external-files-path name="name" path="path" />

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

 类似资料:
  • 如何使用从辅助外部存储器提供文件? 的当前实现只处理 看来,没有办法定义一个

  • 问题内容: 我的开发电话正在运行。 在我的应用程序中,我试图在外部存储上创建一个文件夹,该文件夹将存储我的应用程序的调试信息。基本上,它将包含应用程序执行的所有命令,因此,当用户遇到问题时,我可以选择使它们从debug文件夹发送信息给我进行分析。 我首先尝试将文件写入文件夹,但发现创建文件夹时出错。最初,我使用,然后又移至也不起作用。 我有我的清单。 这是用于创建文件夹的代码: 这是我也尝试过的:

  • 众所周知,谷歌颠覆了Android11的授权概念,并彻底改变了它。 我看了Android留档丛林,但没有找到答案的问题是否仍然可以在外部存储(名为 /storage/emulated/0/)的根目录中创建一个文件夹。如果是,如何? 我的应用在Android上写 临时解决办法可以是这样的: 但这并不理想。如果用户从Android10切换到Android11,那么就有一个大问题。我需要什么额外的代码才

  • 我正在制作一个soundboard应用程序,当长按按钮1时,我需要共享sound1。我可以用以下代码创建共享菜单: 我可以与whatsapp和Google Drive完美共享音频文件,但其他应用程序不起作用。我听说您必须将文件复制到外部存储,并从那里共享它们。我已经搜索了将近两天,但我找不到这样做的方法。Stack上的其他文章也帮不了我:/ 如何在外部存储器中创建目录,将文件(sound1.ogg

  • 我正在使用QAF,这是一个很棒的工具,但我有一个问题。有没有什么方法可以像在BDD文件中那样使用自定义数据提供程序参数化cucumber功能步骤? 例如,我们可以从外部文件插入数据 在里面BDD是这样做的: