无法使用FileProvider打开普通文本文件

时间:2018-02-10 20:44:20

标签: android android-intent android-8.0-oreo android-fileprovider

我疯了,我过去使用过新的Android FileProvider,但我无法使用下载文件夹中的(简单的)刚刚创建的文件。< / p>

AsyncTask.onPostExecute我致电

Intent myIntent = new Intent(Intent.ACTION_VIEW, FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileprovider", output));
myIntent.setType("text/plain");
myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(myIntent);

我的FileProvider XML就像这样

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

在Genymotion模拟器中我总是得到,选择Amaze Text Editor作为目标应用: enter image description here

虽然我可以使用HTML Viewer查看文件内容: enter image description here

我无法理解这种行为,并修复了使用所需的文本编辑器打开纯文本文件应该是一件微不足道的事情。

非常感谢 尼古拉

1 个答案:

答案 0 :(得分:1)

好的,这里有两个问题。一个是代码中的一个错误,它触发了Amaze中的一个错误,一个是Amaze中的一个错误,你可以解决它。

Uri有一个令人讨厌的副作用:它会清除Intent中的setDataAndType(null, ...)。它相当于调用...(其中Uri是您的MIME类型)。那不好。因此,不是将setType()放在构造函数中并调用setDataAndType(),而是调用Uri并在那里提供Uri。 这会让你超越最初的Amaze错误,moved

然而,他们尝试在读写模式下打开FileNotFoundException。您只授予读取权限,因此失败。他们的第二个错误是,当他们无法以读写模式打开文件时,他们认为他们得到Intent myIntent = new Intent(Intent.ACTION_VIEW); myIntent.setDataAndType(FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileprovider", output), "text/plain"); myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivity(myIntent); ,此时他们尝试只读模式。实际上,至少在Android 8.1上they fail to handle a null Uri correctly。您可以通过提供读写权限来解决此问题。

因此,除非您特别想阻止写访问,否则此代码有效:

{{1}}