Android: FileProvider в пользовательской внешней папке хранения
Я пытаюсь настроить файл файл для совместного доступа к файлу. Мои файлы сохраняются в папке "AppName" во внешнем хранилище (на том же уровне, что и папки Android, фильмы и рисунки).
Вот моя конфигурация поставщика файлов:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mydomain.appname.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
и file_paths.xml:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="mypath" path="AppName" />
</paths>
Когда я пытаюсь получить доступ к моему файлу с помощью:
Uri fileUri = FileProvider.getUriForFile(activity, "com.mydomain.appname.fileprovider",
new File("/storage/emulated/0/AppName/IMG_20160419_095211.jpg"));
Он возвращает ошибку:
java.lang.IllegalArgumentException:
Не удалось найти настроенный корень, содержащий /storage/emulated/ 0/AppName/IMG_20160419_095211.jpg на android.support.v4.content.FileProvider $SimplePathStrategy.getUriForFile(FileProvider.java:678) на android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377)
Он работал отлично, прежде чем, когда я использовал встроенный каталог, например Pictures или Movies, мой файл_файлы .xml определялся следующим образом:
<external-path name="photos" path="Pictures" />
<external-path name="videos" path="Movies" />
Но теперь я хочу сохранить файл в своей папке. Я что-то пропустил с помощью конфигурации FileProvider?
Ответы
Ответ 1
<files-path name="name" path="path" />
Представляет файлы в подкаталоге files/вашего внутреннего хранилища приложения. Этот подкаталог совпадает со значением, возвращаемым Context.getFilesDir().
<external-path name="name" path="path" />
Представляет файлы в корне области внешнего хранилища. Корневой путь этого подкаталога совпадает со значением, возвращаемым Environment.getExternalStorageDirectory().
<external-files-path name="name" path="path" />
Представляет файлы в корне области внешнего хранилища вашего приложения. Корневой путь этого подкаталога совпадает со значением, возвращаемым Context # getExternalFilesDir (String) Context.getExternalFilesDir(null).
для более подробной информации, пожалуйста, проверьте Android документ FileProvider. В некоторых конфигурациях, например на рисунке ниже, com.view.asim.enterprise - это имя моего пакета. ![enter image description here]()
Ответ 2
Во-первых, я знаю, что это старый пост, но это самый близкий вопрос, который был похож на мою проблему, поэтому я опубликую свое решение.
Причиной этой ошибки является то, что путь, который вы поставляете в файле поставщика, либо
- a) Неправильно написано и не существует в
external-path
- b) Использование абсолютного пути
/storage/emulated/0
Он возвращает Failed to find configured root that contains ...
, потому что не может найти эту папку. Поэтому убедитесь, что вы пишете только каталог, который хотите поделиться, и убедитесь, что оно написано правильно. Помните, что когда вы объявляете external-path
, это эквивалент вызова Enviornment.getExternalStorageDirectory()
. Поскольку вы пишете имя каталога при создании файла, вам не нужно указывать path
в вашем файле поставщика, как все, что он делает является маской независимо от значения в пути с именем.
Таким образом, ваш путь к провайдеру будет следующим:
<external-path name="my_files" />
и ваш код будет выглядеть следующим образом:
File file = new File(new File(Environment.getExternalStorageDirectory(), "myfolder"), "file.ext");
Uri uri = FileProvider.getUriForFile(context, fileProvider, file);
Ваш путь uri затем даст следующий
content://fileprovider/my_files/myfolder/file.ext
Если вы указали путь в своем файле поставщика, ваш путь к uri будет выглядеть следующим образом:
content://fileprovider/my_files/file.ext
Ответ 3
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
<external-files-path
name="external_files"
path="." />
<!-- FOR SD CARD-->
<root-path
name="sdcard1"
path="." />
</paths>
Ответ 4
Я исправил его
<!--THIS IS EVIL-->
<root-path
name="sdcard1"
path="." />
Ответ 5
У меня было то же самое. В моем случае мне пришлось очищать сборку в Android Studio (Build > Clean Project) каждый раз, когда я изменял путь файлового файла в файле file_paths.xml.
Ответ 6
В <external-path name="mypath" path="AppName"/>
name = "mypath" - mypath должен быть определенным фрагментом из имени вашего файла изображения, скажем, name = "IMG" будет работать, если все ваши файлы изображений имеют "IMG" в названии, судя по вашему примеру кода, это так.
path = "AppName" - это имя папки, которое вы создали во внешних для ваших изображений, и в конце оно нуждается в "/", т.е. path = "AppName/"
поэтому <external-path name="IMG" path="AppName/"/>
должен это сделать, а FileProvider должен найти и позволить другим приложениям получать доступ к вашим изображениям, когда вы запрашиваете Uri с помощью FileProvider.getUriForFile().
Надеюсь, поможет.
Ответ 7
Замените ваш путь XML на
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path
name="extfiles" path="."/> </paths>