请原谅我问了一个可能很愚蠢的问题,但我真的无法在任何地方找到答案。
我需要我的程序将 EditText 的内容保存为 html 文件并与其他应用程序共享。为此,我需要将文件写入内部存储,然后获取它的 URI。然而,任何地方都没有关于如何做到这一点的信息(我可以很好)。
这是我的代码(Editor 是 Activity 的名称,myapp 是包的名称):
String filename = "Lorem ipsum.html";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(Html.toHtml(textField.getText()).getBytes());
outputStream.close();
System.out.println(filename);
} catch (Exception e) {
e.printStackTrace();
}
Intent shareIntent = ShareCompat.IntentBuilder.from(Editor.this)
.setStream(FileProvider.getUriForFile(Editor.this, "com.myapp.fileprovider", new File(filename)))
.getIntent();
shareIntent.setData(FileProvider.getUriForFile(Editor.this, "com.myapp.fileprovider", new File(filename)));
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(shareIntent);
据我所知,文件创建部分工作得很好;没有发现任何异常。然而,实际的共享部分因以下错误而崩溃:
java.lang.IllegalArgumentException: Failed to find configured root that contains /Lorem ipsum.html
在尝试查找 URI 时,我显然做错了什么,但我一直无法找到解决方案。遵循官方文档没有帮助,我找不到这个特定问题的示例。
如果重要的话,这是我的文件提供者声明:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/paths" />
</provider>
预先感谢您的帮助。
最佳答案
在您的代码中:
FileProvider.getUriForFile(Editor.this, "com.myapp.fileprovider", new File(filename))
第三个参数相当于:
new File("Lorem ipsum.html"");
这是无效的。
您应该在File
的构造函数中使用文件的完整路径作为参数。
正如@Fatih 所评论的,你应该使用
new File(getFilesDir(), filename)
作为第三个参数。
list 中的 authorities
参数也应更正为:
android:authorities="${applicationId}.provider"
所以你的最终陈述将是:
Uri uri= FileProvider.getUriForFile(Editor.this,
getApplicationContext().getPackageName() + ".provider",
new File(Editor.this.getFilesDir(), filename));
关于java - 从我刚刚创建的文件中获取 Uri (android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46691567/