我疯了,我过去使用过新的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作为目标应用:
我无法理解这种行为,并修复了使用所需的文本编辑器打开纯文本文件应该是一件微不足道的事情。
非常感谢 尼古拉
答案 0 :(得分:1)
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}}