FileProvider and secondary external storage
android, android-external-storage, android-fileprovider
Solution
FileProvider not support secondary storage because of the code below:
Code from 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)) {
However, there is a special TAG in FileProvider : root-path which is not covered in official reference.
if (TAG_ROOT_PATH.equals(tag)) {
target = DEVICE_ROOT;// DEVICE_ROOT = new File("/");
} else if (TAG_FILES_PATH.equals(tag)) {
So, root-path matches all the path.
Just type this code in your FileProvider xml, then FileProvider can handle File in secondary storage.
<root-path name="root" path="." />
Be aware, it may leak your directory structure.
Problem
How can I serve files from the SECONDARY external storage using the `FileProvider`? The current implementation of the `FileProvider` handles only the first directory returned by `ContextCompat.getExternalFilesDirs` ``` ... } else if (TAG_EXTERNAL_FILES.equals(tag)) { File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null); if (externalFilesDirs.length > 0) { target = externalFilesDirs[0]; } } ... ``` It seems, that there is no way to define a `<path>` entry for the `FileProvider`, that matches the secondary external storage path...