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...

Original source