FileProvider和辅助外部存储

art*_*nig 7 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];
   }
}
...
Run Code Online (Sandbox Code Playgroud)

看来,没有办法为匹配辅助外部存储路径的<path>条目定义FileProvider...

art*_*nig 5

答案是……FileProvider不支持。对于 Android 7,由于file://Uri 方案的弃用,这甚至是一个问题。

我发布了一个错误报告


Sha*_*haw 5

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

来自 support: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)) {
Run Code Online (Sandbox Code Playgroud)

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

            if (TAG_ROOT_PATH.equals(tag)) {
                target = DEVICE_ROOT;// DEVICE_ROOT = new File("/");
            } else if (TAG_FILES_PATH.equals(tag)) {
Run Code Online (Sandbox Code Playgroud)

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

只需在您的 FileProvider xml 中键入此代码,FileProvider 就可以处理二级存储中的文件。

<root-path name="root" path="." />
Run Code Online (Sandbox Code Playgroud)

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