这些FileProvider中又有一个迷失了灵魂……我已经在解决这个问题上超过一天了,看来我缺少了一些重要的东西。任何帮助,将不胜感激!
我正在尝试使用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>
file_paths.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();
}
和乌里创作:
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)所述:
<external-files-path name =“ name” path =“ path” />代表应用程序外部存储区根目录中的文件。该子目录的根路径与Context#getExternalFilesDir(String)Context.getExternalFilesDir(null)返回的值相同。
因此,我的xml中的external-files-path似乎与context.getExternalFilesDir
我使用的方法匹配。我在两个地方都有“导出”文件夹。当局似乎匹配...可能是我的问题。我找不到找到和打印FileProvider的“配置根目录”的方法
看来我找到了解决方法或解决方法。改变我是从使用的根目录类型external-files-path
以cache-path
在XML和context.getExternalFilesDir("export");
以File dir = new File(context.getCacheDir(), "export");
用于获取文件夹中创建文件。
并且我成功地附加了文件。请注意,在FileProvider类的FileProvider.java中,我发现了以下用于构造Uris的代码:
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_FILES或类似的东西,因此这看起来像文档和实现之间的不匹配,实际上不支持external-files-path
该getExternalFilesDir
方法的匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句