2

这些 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>

文件路径.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)所述:

< external-files-path name="name" path="path" /> 代表应用外部存储区域根目录中的文件。该子目录的根路径与 Context#getExternalFilesDir(String) Context.getExternalFilesDir(null) 返回的值相同。

所以我的 xml 中的 external-files-path 似乎与context.getExternalFilesDir我使用的方法相匹配。这两个地方我都有“导出”文件夹。当局似乎匹配......我的问题可能是什么。我找不到找到并打印 FileProvider 的“已配置根”的方法

4

3 回答 3

6

看来我找到了解决方法或修复。更改我在 xml中使用的根目录类型 from external-files-pathto和 from to以获取文件夹以创建文件。cache-pathcontext.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

于 2016-09-03T06:54:41.670 回答
1
File photoFile =new File(fullFileName);

        if (photoFile != null) {

            Uri photoURI =FileProvider.getUriForFile(MainActivity.this(your activity name),
                        BuildConfig.APPLICATION_ID + ".provider", photoFile);
}

如果你像这样创建 Uri 可能对你有用。

于 2016-09-02T13:10:13.920 回答
1

有一些解决方法:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="logs" path="../logs/" />
    <!-- use ".." to get files from app's root data dir -->
</paths>

/data/data/xxx.xxx.xxx/ 在我的情况下提供文件是/data/data/xxx.xxx.xxx/logs/

于 2016-10-11T22:32:29.967 回答