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

FileProvider”未能找到已配置的root”异常

邵诚
2023-03-14

又一个文件提供商失去了灵魂。。。我已经在这个问题上工作了一天多了,似乎我错过了一些重要的东西。任何帮助都将不胜感激!

我试图发送电子邮件附件使用文件提供商。

我的Androidanifest.xml部分:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="todolistj.todolist.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

文件路径。xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="lists_to_send" path="export/"/>
</paths>

创建附件:

String content = "hello world";
File file;
FileOutputStream outputStream;
try {
    File dir = context.getExternalFilesDir("export");
    if(!dir.exists()) dir.mkdir();
    file = new File(dir, "MyCache");
    if (file.exists ()) file.delete ();
    outputStream = new FileOutputStream(file);
    outputStream.write(content.getBytes());
    outputStream.close();
    return file.getAbsolutePath();
} catch (IOException e) {
    e.printStackTrace();
}

以及Uri创建:

    File readF = new File(fullFileName);
Uri uri = FileProvider.getUriForFile(this, "todolistj.todolist.fileprovider", readF);

其中fullFileName是创建文件时在代码段中返回的值。

在Uri创建行上,我得到异常:

...
Caused by: java.lang.IllegalArgumentException: Failed to find configured 
root that contains /storage/emulated/0/Android/data/todolistj.todolist/files/export/MyCache
...

如留档(https://developer.android.com/reference/android/support/v4/content/FileProvider.html)所述:

因此,xml中的外部文件路径似乎与上下文匹配。getExternalFilesDir我正在使用的方法。这两个地方我都有“导出”文件夹。当局似乎与。。。我可能有什么问题。我无法找到并打印FileProvider的“已配置根目录”

共有3个答案

池阳伯
2023-03-14

有一些工作狂:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="logs" path="../logs/" />
    <!-- use ".." to get files from app's root data dir -->
</paths>

提供文件/data/data/xxx.xxx.xxx/在我的情况下它是/data/data/xxx.xxx.xxx/logs/

干稳
2023-03-14
File photoFile =new File(fullFileName);

        if (photoFile != null) {

            Uri photoURI =FileProvider.getUriForFile(MainActivity.this(your activity name),
                        BuildConfig.APPLICATION_ID + ".provider", photoFile);
}

如果您像这样创建Uri,它可能对您有用。

章哲茂
2023-03-14

看来我找到了解决办法。将我使用的根目录类型从xml中的外部文件路径更改为缓存路径,并从上下文更改为。getExternalFilesDir(“导出”)toFile dir=新文件(context.getCacheDir(),“export”) 用于获取文件夹以创建文件。

我成功地附加了文件。请注意,在FileProvider类的FileProvider.java中,我找到了以下构造Uris的代码:

        if (TAG_ROOT_PATH.equals(tag)) {
            target = buildPath(DEVICE_ROOT, path);
        } else if (TAG_FILES_PATH.equals(tag)) {
            target = buildPath(context.getFilesDir(), path);
        } else if (TAG_CACHE_PATH.equals(tag)) {
            target = buildPath(context.getCacheDir(), path);
        } else if (TAG_EXTERNAL.equals(tag)) {
            target = buildPath(Environment.getExternalStorageDirectory(), path);
        }

看起来只支持以下4个文件夹:标记根路径、标记文件路径、标记缓存路径、标记外部。没有标记外部文件或类似的文件,因此文档和实现之间似乎不匹配,实际上不支持与getExternalFilesDir方法匹配的externalfiles路径。

 类似资料:
  • 我创建了一个应用程序,创建gpx文件。除了分享,一切都很好。因此,我创建了一个文件提供程序。你可以在下面看到它的配置。提供商在运行Android8.0.0的Android设备上工作正常,但在朋友华为(6.0)上不工作 清单中的提供者: 文件路径。xml: 代码中的用法: 我希望有人能帮我找到导致应用程序在某些设备上崩溃的错误...

  • 我通过android下载管理器下载视频,并希望分享此视频,我通过Manifas进行跟踪 在文件中path.xml添加以下内容: 并使用此提供程序: 但我得到错误: JAVAlang.IllegalArgumentException:未能找到包含/data/data/sawbodeployer的配置根目录。恩。伊利诺伊州edu/files/AKA1_Fante_加纳_洗手_决赛。3gp 它的问题在哪

  • 我试图按照本指南共享从glide加载到imageview中的图像,它给了我一个非法参数异常。我已经把代码和stacktrace贴在下面了 维护性。xml Androidmanifest。xml 文件提供者。xml 堆栈痕迹 JAVAlang.IllegalArgumentException:未能找到包含/storage/sdcard0/images1502651207040的配置根目录。Andro

  • 我正试图用相机拍照,但出现以下错误: AndroidManifest。xml: Java: 文件路径。xml 我整天都在搜索这个错误,试图理解,但我不知道这个错误消息试图告诉我什么。如果您需要更多信息/代码,请在评论中给我写信。

  • 我知道关于这个问题有很多问题。我尝试了大约10种不同的方法,但都没有成功。我总是会遇到下一个错误: 官方教程也没有帮助。我将在下面分享我的代码,也许我做错了什么,你知道这里到底出了什么问题。。 清单: provider_paths.xml 我将文件保存到: 文件路径的示例:file:///storage/emulated/0/Android/data/app.kwork/files/IMG-afb

  • 我找到了这么多与FileProvider相关的链接,但我没有找到缓存目录的解决方案 JAVAlang.IllegalArgumentException:未能找到包含 我想使用它的缓存目录,我怎么能给路径提供商。 我用它作为: 它的工作罚款,如果我给应用程序文件夹路径,但不与缓存目录工作。 有什么帮助吗?