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>