似乎现在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()暴露在应用程序之外
似乎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软件包。所以,我做到了。我又跑了一次,但同样的错误又出现了。因