FileProvider和辅助外部存储

时间:2016-10-29 10:20:31

标签: android android-external-storage android-fileprovider

如何使用FileProvider

从SECONDARY外部存储中提供文件

FileProvider的当前实现仅处理ContextCompat.getExternalFilesDirs

返回的第一个目录
...    
} else if (TAG_EXTERNAL_FILES.equals(tag)) {
   File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
   if (externalFilesDirs.length > 0) {
       target = externalFilesDirs[0];
   }
}
...

似乎没有办法为<path>定义FileProvider条目,该条目与辅助外部存储路径相匹配......

5 个答案:

答案 0 :(得分:4)

答案是...... FileProvider不支持。由于file:// Uri计划已弃用,因此在Android 7中这更是一个问题。

我发了bug report

答案 1 :(得分:3)

要处理位于外部sdcards上的文件,我将provider_paths.xml更改为

.Elem()

答案 2 :(得分:3)

由于以下代码,FileProvider不支持二级存储:

支持代码:support-core-utils:26.1.0 FileProvider

            } else if (TAG_EXTERNAL_FILES.equals(tag)) {
                File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
                if (externalFilesDirs.length > 0) {
                    target = externalFilesDirs[0];// Code here, That's why!!!
                }
            } else if (TAG_EXTERNAL_CACHE.equals(tag)) {

但是,FileProvider中有一个特殊的TAG: root-path ,官方参考中未提及。

            if (TAG_ROOT_PATH.equals(tag)) {
                target = DEVICE_ROOT;// DEVICE_ROOT = new File("/");
            } else if (TAG_FILES_PATH.equals(tag)) {

因此,root-path匹配所有路径。

只需在FileProvider xml中输入此代码,然后FileProvider就可以在二级存储中处理File。

<root-path name="root" path="." />

请注意,它可能会泄露您的目录结构。

答案 3 :(得分:1)

作为解决方法,您可以使用绝对路径:

find

答案 4 :(得分:1)

所以我最终做了以下事情:

尝试通过FileProvider创建到Uri,如果由于以下原因而失败:

java.lang.IllegalArgumentException: Failed to find configured root that contains

我只是在创建一个普通的Uri。

这是我的代码:

try {
        uri = FileProvider.getUriForFile(context,
                MY_AUTHORITY_STRING,
                imageFile);
    } catch (Exception e) {
        CLog.d(TAG, e);
        uri = Uri.fromFile(imageFile);
    }

我不知道为什么,但它正在工作,FileProvider无法访问该文件(因为它在辅助外部存储中),然后在catch子句中成功创建了uri。

奇怪的谷歌......非常奇怪。