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

FileProvider-由于FileNotFoundException:/Download/TempFile,无法保存文件。html(没有这样的文件或目录)

强化
2023-03-14

似乎现在Android N需要FileProvider,所以我正在尝试实现FileProvider以将文件从网络保存到本地临时位置,然后我需要读取此临时文件。

我这样做是为了设置FileProvider:

显示xml:

</application>
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
</application>

然后我有一个提供者路径。我的res/xml文件夹中的xml文件,包括:

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

最后,这是我必须创建临时文件的java代码:

try {

    final File imagePath = new File(getContext().getFilesDir(), "Download");
    final File newFile = new File(imagePath, filename + "." + filePrefix);

    final Uri contentUri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName() + ".provider", newFile);

    final File tempFile = new File(contentUri.getPath());

    tempFile.getParentFile().mkdirs();
    final FileWriter writer = new FileWriter(tempFile);
    writer.flush();
    writer.close();
    return tempFile;
} catch (IOException e) {
    e.printStackTrace();
    return null;
}

最终FileWriter编写器=new FileWriter(temFile);的行抛出异常java.io.FileNotFoundException: /Download/TempFile.html(没有这样的文件或目录)

对我做错了什么有什么建议吗?非常感谢。

更新/编辑:

当前保存文件的方法将文件放置在此处:/Storage/emated/0/下载/TempFile.html

这很好,直到我有意向地消费它,就像这样:

final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), fileType.getMimeType());
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);

然后引发此异常:

android.os.FileUriExposedException:文件:///存储/仿真/0/下载/TempFile.html通过Intent.getData()暴露在应用程序之外

共有1个答案

东门阳飇
2023-03-14

似乎Android N现在需要FileProvider

它将常用,但仅用于使内容可供其他应用程序使用。您的需求似乎不包括使内容可供其他应用程序使用。

我正在尝试实现FileProvider,将文件从网络保存到本地临时位置

您的问题中没有与网络有关的代码。

对我做错了什么有什么建议吗?

在Uri上调用getPath()通常是无用的。充其量,如果Uri的方案是文件,那么它可能是有用的FileProvider专门设计为不提供带有文件方案的Uri,而是提供内容方案。该Uri的路径不会直接表示设备上的文件,正如filenotfoundexception download tempfile(此网页的URL路径)表示计算机上文件的路径一样。

除此之外,您不需要文件提供者来制作临时文件,您也需要文件提供者来通过网络下载内容。

更新(基于问题更新)

首先,替换Uri。带有文件提供者的fromFile(file)。getUriForFile(file)在您的意图逻辑中。

其次,如果您真的要将文件存储在/Storage/emated/0/下载/TempFile.html中,则需要在您的FileProvider配置中使用exoutal-path,而不是files-path。如果您将下载的文件存储在getFilesDir()中,则会使用files-path。您的/存储/emated/0/下载/TempFile.html路径似乎不在Environment.getExternalStorageDirectory()中。

 类似资料:
  • 问题内容: 我正在尝试在文件系统上创建文件,但我不断收到此异常: 我有一个现有目录,并且正在尝试将文件写入该目录。 获取异常: 我对该路径具有写权限,但是未创建文件。 问题答案: 打印完整的文件名或进入调试器。当我对这样的错误感到困惑时,这意味着我的假设和期望与现实不符。确保您可以 看到 路径是什么;它可以帮助您弄清楚哪里出了问题。

  • null 我在用这个代码 但我一直得到这个错误

  • 免责声明:在堆栈溢出中也有类似的问题,但这些问题是他们各自的答案,既不适合这个问题,也不帮助解决他们的答案。这些问题是不同的,答案只适合那些具体的问题,而不是通用的。经过长时间的挣扎,他们没有任何帮助,我想了两次我要发布这个问题来寻求帮助。如果有人不喜欢这个问题或不理解,请沟通并得到澄清,而不是勉强设置标志来关闭这个问题;最好你可以忽略并传递...谢谢你! 需求:我使用Zend框架的谷歌日历API

  • 问题内容: 我在Windows中使用Code :: Blocks。 我创建了一个dll项目,试图获得一些JNI实践。 在javah生成的.h文件中,有#include jni.h,但是当我尝试对其进行编译时,它总是说jni.h:没有这样的文件或目录。 我认为这与classpath有关,但我不知道它是什么!可能是我必须更改Code :: Blocks的设置 有人可以帮我解决这个问题吗?非常感谢 编辑

  • 问题内容: 我从节点应用程序收到此错误: 我知道文件在那里,因为当我尝试使用确切的复制和粘贴路径打开文件时,它可以工作。我也知道应用程序使用的是正确的目录,因为它会在错误中输出它。 问题答案: 波浪形扩展是一件空壳的事情。编写正确的路径名(可能是yourusername )或使用

  • 问题内容: 我最近在运行Ubuntu 12.04 LTS的Macbook Pro上安装了用于C ++开发的KDevelop 4。 我想在我的C ++代码中嵌入Python应用程序。为此,需要包含Python.h头文件。所以,我做到了。 但是,在运行时,我从IDE收到以下响应: 但是,我很快就发现了问题。我还没有下载python- dev软件包。所以,我做到了。我又跑了一次,但同样的错误又出现了。因