Android FileProvider для ext sdcard

Я использую FileProvider для своих внутренних файлов, которые могут быть представлены, например, в Галерее. Чтобы сделать его более однородным, я также поместил свои внешние файлы в провайдер (через внешний путь), но для файлов на съемной SD-карте он не работает. Говорить что-то вроде этой папки не разрешено.

Любая помощь будет оценена.

Спасибо

Начиная с android 4.4, обычным приложениям не разрешается обращаться к вторичным внешним устройствам хранения, то есть к SD-карте, за исключением их каталогов, специфичных для пакета, даже если вы запросили разрешение WRITE_EXTERNAL_STORAGE.

Разрешение WRITE_EXTERNAL_STORAGE должно предоставлять только доступ на запись к основному внешнему хранилищу на устройстве. Приложениям не разрешается записывать на внешние внешние устройства хранения, за исключением их каталогов, специфичных для пакета, которые разрешены с помощью синтезированных разрешений. Ограничение записи таким образом гарантирует, что система может очищать файлы, когда приложения удаляются.

https://source.android.com/devices/storage/

Давайте посмотрим на код FileProvider :

  private static PathStrategy parsePathStrategy(Context context, String authority) ... int type; while ((type = in.next()) != END_DOCUMENT) { if (type == START_TAG) { final String tag = in.getName(); final String name = in.getAttributeValue(null, ATTR_NAME); String path = in.getAttributeValue(null, ATTR_PATH); File target = null; if (TAG_ROOT_PATH.equals(tag)) { target = buildPath(DEVICE_ROOT, path); } else if (TAG_FILES_PATH.equals(tag)) { target = buildPath(context.getFilesDir(), path); } else if (TAG_CACHE_PATH.equals(tag)) { target = buildPath(context.getCacheDir(), path); } else if (TAG_EXTERNAL.equals(tag)) { target = buildPath(Environment.getExternalStorageDirectory(), path); } if (target != null) { strat.addRoot(name, target); } } } return strat; } 

FileProvider принял абсолютные исправления в каталог с помощью root-path тега (константа DEVICE_ROOT). Поэтому просто добавьте абсолютный путь к папке ваших файлов на вторичном внешнем диске, как показано ниже:

 <root-path path="/storage/extSdCard/Android/data/com.edufii/files/image/" name="image-ext2" /> <root-path path="/storage/extSdCard/Android/data/com.edufii/files/video/" name="video-ext2" /> <root-path path="/storage/extSdCard/Android/data/com.edufii/files/datafile/" name="datafile-ext2" /> <root-path path="/storage/extSdCard/Android/data/com.edufii/files/audio/" name="audio-ext2" /> 

Обратите внимание, что официальная документация ничего не говорит о <root-path> , поэтому она может измениться в будущем.

Я добавил этот корневой путь, предложенный @Gubatron в моем XML, и он работает.

 <?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="."/> <root-path name="external_files" path="/storage/" /> </paths> 

FileProvider не поддерживает вторичное внешнее хранилище (например, съемные SD-карты). Это еще больше проблема в Android 7 и выше – потому что вы больше не можете использовать file:// uris.

Я уже опубликовал отчет об ошибке.