还有一个文件提供者失去了灵魂…我已经研究这个问题一天多了,似乎我遗漏了一些重要的东西。任何帮助都将不胜感激!
我正在尝试使用FileProvider发送带有附件的电子邮件。
我的androidmanifest.xml部分:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="todolistj.todolist.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
文件路径.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="lists_to_send" path="export/"/>
</paths>
创建附件:
String content = "hello world";
File file;
FileOutputStream outputStream;
try {
File dir = context.getExternalFilesDir("export");
if(!dir.exists()) dir.mkdir();
file = new File(dir, "MyCache");
if (file.exists ()) file.delete ();
outputStream = new FileOutputStream(file);
outputStream.write(content.getBytes());
outputStream.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
以及uri的创建:
File readF = new File(fullFileName);
Uri uri = FileProvider.getUriForFile(this, "todolistj.todolist.fileprovider", readF);
其中
fullFileName
是用于创建文件的代码段中返回的值。在uri创建行中,我得到异常:
...
Caused by: java.lang.IllegalArgumentException: Failed to find configured
root that contains /storage/emulated/0/Android/data/todolistj.todolist/files/export/MyCache
...
正如本文(https://developer.android.com/reference/android/support/v4/content/FileProvider.html)所述:
表示应用程序外部存储区域根目录中的文件。此子目录的根路径与返回的值相同
按上下文getexternalfilesdir(字符串)
context.getexternalfilesdir(空)。
因此,来自XML的外部文件路径似乎与我正在使用的
context.getExternalFilesDir
方法匹配。两个地方我都有“导出”文件夹。当局似乎匹配…我有什么问题。我无法找到并打印文件提供程序的“配置根”
最佳答案
看来我找到了解决办法。
将我在xml中使用的根目录类型从external-files-path
更改为cache-path
,并从context.getExternalFilesDir("export");
更改为File dir = new File(context.getCacheDir(), "export");
,以获取创建文件的文件夹。
我成功地附加了这个文件。注意,在fileprovider类的fileprovider.java中,我找到了以下用于构造uri的代码:
if (TAG_ROOT_PATH.equals(tag)) {
target = buildPath(DEVICE_ROOT, path);
} else if (TAG_FILES_PATH.equals(tag)) {
target = buildPath(context.getFilesDir(), path);
} else if (TAG_CACHE_PATH.equals(tag)) {
target = buildPath(context.getCacheDir(), path);
} else if (TAG_EXTERNAL.equals(tag)) {
target = buildPath(Environment.getExternalStorageDirectory(), path);
}
看起来只支持以下4个文件夹:tag_root_path、tag_files_path、tag_cache_path、tag_external。没有tag_external_文件或类似的文件,所以看起来文档和实现之间不匹配,实际上不支持与
external-files-path
方法匹配的getExternalFilesDir
。关于android - FileProvider“无法找到已配置的根”异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39293114/