android - FileProvider 和二级外部存储

标签 android android-external-storage android-fileprovider

我如何使用 FileProvider 提供辅助外部存储中的文件? ?

当前执行 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 的条目, 匹配辅助外部存储路径...

最佳答案

由于以下代码,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 就可以处理辅助存储中的文件。

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

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

关于android - FileProvider 和二级外部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40318116/

相关文章:

android - Android 11 上的新 BlobStoreManager 读写

Android Intent to Gmail 不通过 FileProvider 附加文​​件 "Unable to attach file"

java - 与 FileProvider 共享原始文件夹中的文件

java - 选择sqlite android

Android - adb tcpip 错误

android - Gradle-Android-基于一对(productFlavors,buildTypes)的buildConfigField

android - 安全异常 : Permission Denial: reading (only on emulator)

android - 更新 android studio 和构建工具后,找不到与 android 中给定名称错误匹配的资源

android - 在外部存储API 23上创建新目录

android - 没有找到类 "androidx.core.content.FileProvider"