- Android: FileProvider Issue: Failed to find configured root that contains . #218
- Comments
- michaelmika commented Feb 27, 2018 •
- Versions:
- nu5rim3 commented Mar 16, 2018
- ricardochen commented Mar 20, 2018
- ricardochen commented Mar 20, 2018
- Mifayo commented Mar 29, 2018 •
- same here
- svnshikhil commented Apr 4, 2018
- tuananhluong commented Apr 15, 2018 •
- Catlc commented May 16, 2018
- tuananhluong commented May 17, 2018
- zynnthen commented Jun 12, 2018 •
- yeomann commented Jul 27, 2018
- jgcmarins commented Jul 27, 2018
- vforvasile commented Sep 29, 2018
- jgcmarins commented Sep 29, 2018
- raulcostea77 commented Oct 1, 2018
- lucaspang commented Oct 26, 2018
- [Android] TakePhotoAsync — IllegalArgumentException: failed to find configured root #329
- Comments
- Knots23 commented Aug 23, 2017 •
- Bug Information
- Steps to reproduce the Behavior
- Expected Behavior
- Actual Behavior
- Code snippet
- jamesmontemagno commented Aug 23, 2017
- Knots23 commented Aug 24, 2017
- jamesmontemagno commented Aug 30, 2017
- obartelt commented Sep 26, 2017
- mrTR24 commented Oct 2, 2017 •
- Ошибка FileProvider на устройствах Huawei
- FileProvider — IllegalArgumentException: Не удалось найти настроенный root
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
- Ответ 16
- data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
- Ответ 17
- Ответ 18
- Ответ 19
- Ответ 20
- Ответ 21
- Ответ 22
- Ответ 23
- Ответ 24
- Ответ 25
- Ответ 26
- Ответ 27
- Ответ 28
- Ответ 29
- Ответ 30
Android: FileProvider Issue: Failed to find configured root that contains . #218
Comments
michaelmika commented Feb 27, 2018 •
my problem is related to #202 . I am also using react-native-image-crop-picker which implements FileProvider in their own Manifest. Therefore I override their FileProvider Entry in my Manifest (note: I do not override the android:authorities entry, but the path ressource):
file_paths.xml looks like this (note: I also added the path defined by react-native-image-crop-picker ‘s Manifest):
I also edited my MainApplication and added the following (note: BuildConfig.APPLICATION_ID instead of $
Now, trying really everything, I do not believe anymore that it is caused (only) by react-native-image-crop-picker as in #202 . I now get this error:
My react-native use of the Share library looks this way:
and the file is created before at dir: RNFS.ExternalDirectoryPath + «/test.txt» . I have also tried every other RNFS Directory (e.g. DocumentDirectoryPath). The file is really there, i can read it with RNFS .
What am I missing? Have now worked on this for days and really need to get around this problem.
Versions:
react-native-share: 1.0.26
react-native: 0.52.2
react-native-image-crop-picker: 0.19.1
The text was updated successfully, but these errors were encountered:
nu5rim3 commented Mar 16, 2018
# Any solution
ricardochen commented Mar 20, 2018
Same problem here.
ricardochen commented Mar 20, 2018
I ended up taking the URI and converting it to base64 , working in android, not tested in iOS
Mifayo commented Mar 29, 2018 •
same here
svnshikhil commented Apr 4, 2018
tuananhluong commented Apr 15, 2018 •
I resolved as bellow, may be can help someone.
Step1: In the file app/src/main/AndroidManifest.xml,
- Use xmlns:tools
Example in my app:
Step2: Create file provider_paths.xml at app/src/main/res/xml/
Example in my app:
Step3: Update MainApplication.java, implement ShareApplication
Example in my app:
Noted: com.ulo is my applicationId, change to your applicationId (you can check id in app/build.gradle)
Package: react-native / react-native-share / react-native-image-crop-picker
Catlc commented May 16, 2018
Step3 !!! return «com.ulo.provider»; This value is not passed in the past and getFileProviderAuthority Not be invoked why????
tuananhluong commented May 17, 2018
@Catlc ulo is my applicationId, replace by your appid
zynnthen commented Jun 12, 2018 •
try this at your file_paths
yeomann commented Jul 27, 2018
this seems fixed, can we close?
jgcmarins commented Jul 27, 2018
already fixed on 1.1.0.
vforvasile commented Sep 29, 2018
Not fixed, not very fun.
jgcmarins commented Sep 29, 2018
@vforvasile which errors are you experiencing?
raulcostea77 commented Oct 1, 2018
@vforvasile, besides what @tuananhluong posted, I added the following line to my filepaths.xml:
This seems to have fixed my issue
lucaspang commented Oct 26, 2018
I have the same problem, my file is saved at:
file:///data/user/0/com.applicationId/cache/image_manager_disk_cache/a551283a40d90aa951eb098148ed0a6423a78ec29f8df43a7fe2a79a7f85794d.0
and getting this error:
Failed to find configured root that contains /data/data/com.applicationId/cache/image_manager_disk_cache/a551283a40d90aa951eb098148ed0a6423a78ec29f8df43a7fe2a79a7f85794d.0
I have already applied all possible path in provider path and still no luck
Источник
[Android] TakePhotoAsync — IllegalArgumentException: failed to find configured root #329
Comments
Knots23 commented Aug 23, 2017 •
I’m running into issues with the TakePhotoAsync method.
They don’t occur on iOS, nor on Android with Target SDK 23.
Note: all ‘MY_PACKAGE_NAME’ found below are actually containing the correct package. 😉
- issue 312
- Settings the external path in file_paths.xml to ‘Pictures’ as specified in the readme throws the exception.
- Settings the external path in file_paths.xml to ‘Android/data/MY_PACKAGE_NAME/files/Pictures’ throws the exception.
- issue 326
- This seems to occur when you don’t add the entries to the manifest / file_paths.xml as specified in the readme.
Bug Information
Version Number of Plugin: 2.6.2
Device Tested On: Samsung S8 (Android 7.0), iPhone 5s
Simulator Tested On: n.a.
Version of VS: Visual Studio 2017 15.3
Version of Xamarin: 2.3.4.267
Versions of other things you are using: Plugin.Permissions 1.2.1
Steps to reproduce the Behavior
Everything should be setup as described in the readme:
- Target Android SDK is 25, so:
- xml folder was created under Resources
- file_paths.xml was created under that xml folder
- the provider was added to the manifest, where the package name placeholder was replaced with my own package name.
Create a view and view model where the view model holds an ICommand to handle, e.g. a button click.
Call the TakePhotoAsync in the handler.
Expected Behavior
The camera dialog will be opened and allows you to take a picture.
Actual Behavior
An exception is thrown:
Java.Lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/MY_PACKAGE_NAME/files/Pictures/IMG_20170823_130231.jpg
The ‘Pictures’ folder was created, both on the internal and external storage. There’s just no image.
Code snippet
The text was updated successfully, but these errors were encountered:
jamesmontemagno commented Aug 23, 2017
What is your package name? It must be set to something like «com.company.appname»
Rest assured this works fine just try the samples.
Knots23 commented Aug 24, 2017
The package name is correct and exactly in the form ‘com.company.appname’.
The permissions should not be the issue. These are set (among others):
- Camera
- Write External Storage
- Read External Storage
Like I said, it did work with Android API 23, but after upgrading to 25 it stopped, even though I followed the readme and add all extra settings.
jamesmontemagno commented Aug 30, 2017
If you can create a small sample that I can reproduce send it my way to test out.
obartelt commented Sep 26, 2017
I had the same problem. You need to change the file_paths.xml. It must read:
mrTR24 commented Oct 2, 2017 •
following +1 .same problem with target sdk 24 . works fine with 23
Источник
Ошибка FileProvider на устройствах Huawei
У меня есть исключение, которое происходит только на устройствах Huawei в моем приложении при использовании FileProvider.getUriForFile :
Вот определение моего поставщика файлов в моем манифесте:
Файл ресурсов с настроенными путями:
Любая идея о причине этой проблемы и почему это происходит только на устройствах Huawei? Как мне отладить это, учитывая, что у меня нет устройства Huawei?
ОБНОВИТЬ:
Я добавил больше журналов в свое приложение, и я получил некоторые непоследовательные результаты при печати как ContextCompat.getExternalFilesDirs и context.getExternalFilesDir на этих устройствах:
Это несовместимо с документацией ContextCompat.getExternalFilesDirs которая заявляет, что The first path returned is the same as getExternalFilesDir(String)
Это объясняет проблему, так как я использую context.getExternalFilesDir в своем коде, а FileProvider использует ContextCompat.getExternalFilesDirs .
Обновление для Android N (оставив исходный ответ ниже и подтвердив, что этот новый подход работает в производстве):
Как вы отметили в своем обновлении, многие модели устройств Huawei (например, KIW-L24, ALE-L21, ALE-L02, PLK-L01 и многие другие) нарушают контракт Android для вызовов ContextCompat#getExternalFilesDirs(String) . Вместо того, чтобы возвращать Context#getExternalFilesDir(String) (т.е. запись по умолчанию) в качестве первого объекта в массиве, они вместо этого возвращают первый объект в качестве пути к внешней SD-карте, если таковой присутствует.
Разрушая этот контракт на заказ, эти устройства Huawei с внешними SD-картами будут сбой с IllegalArgumentException при вызовах FileProvider#getUriForFile(Context, String, File) для корней external-files-path . Хотя существует множество решений, которые вы можете предпринять, чтобы попытаться решить эту проблему (например, написать пользовательскую реализацию FileProvider ), я нашел, что самый простой подход – уловить эту проблему и:
- Pre-N: Возврат Uri#fromFile(File) , который не будет работать с Android N и выше из-за FileUriExposedException
- N: Скопируйте файл в свой cache-path (обратите внимание: это может ввести ANR, если это сделано в потоке пользовательского интерфейса), а затем вернуть FileProvider#getUriForFile(Context, String, File) для скопированного файла (т. FileProvider#getUriForFile(Context, String, File) избежать ошибки)
Код для этого можно найти ниже:
Наряду с file_provider_paths.xml :
После того как вы создали такой класс, замените свои вызовы на:
Честно говоря, я не думаю, что это особенно грациозное решение, но это позволяет нам использовать официально зарегистрированное поведение Android, не делая ничего слишком радикального (например, написание пользовательской реализации FileProvider ). Я тестировал это на производстве, поэтому могу подтвердить, что он устраняет эти сбои Huawei. Для меня это был лучший подход, поскольку я не хотел тратить слишком много времени на то, что явно является дефектом производителя.
Обновление до устройств Huawei с этой ошибкой, обновленной до Android N:
Это не будет работать с Android N и выше из-за FileUriExposedException , но мне еще предстоит столкнуться с устройством Huawei с этой неправильной конфигурацией на Android N.
У меня была такая же проблема, и в конечном итоге мое решение заключалось в том, чтобы всегда использовать вызов ContextCompat.getExternalFilesDirs для создания File который используется как параметр для FileProvider . Таким образом, вам не нужно использовать какие-либо из вышеперечисленных способов обхода.
Другими словами. Если у вас есть контроль над параметром File который вы используете для вызова FileProvider и / или вам все равно, что файл может быть сохранен вне каталога classic /storage/emulated/0/Android/data/ (который должен быть Отлично, поскольку все это одна и та же SD-карта), тогда я предлагаю сделать то, что я сделал.
Если это не ваше дело, я предлагаю использовать вышеупомянутый ответ с пользовательской реализацией getUriForFile .
Мое решение этой проблемы прямо сейчас, даже если это не так, заключается в объявлении моего FileProvider следующим путем (чтобы можно было обслуживать все файлы на устройстве):
Это официально не документировано и может разорваться с будущей версией библиотеки поддержки v4, но я не вижу другого решения для работы с файлом во вторичном внешнем хранилище (часто с SD-картой) с использованием существующего FileProvider .
Источник
FileProvider — IllegalArgumentException: Не удалось найти настроенный root
Я пытаюсь сделать снимок с камерой, но я получаю следующую ошибку:
Я искал весь день об этой ошибке и пытался понять FileProvider , но я понятия не имею, что это сообщение об ошибке пытается мне рассказать. Если вы хотите получить дополнительную информацию/код, напишите мне в комментарии.
ОТВЕТЫ
Ответ 1
Ваш файл хранится в getExternalFilesDir() . Это сопоставляется с , а не . Кроме того, ваш путь к файлу не содержит images/ в нем, поэтому атрибут path в вашем XML недопустим.
Замените res/xml/file_paths.xml на:
Ответ 2
Аналогичная проблема возникла после активированных ароматов (dev, stage).
До того, как ароматы моего ресурса путей выглядели так:
После добавления android: authority = «$
Ответ 3
Это может решить любую проблему: все теги добавляются, поэтому вам не нужно беспокоиться о пути к папкам. Замените res/xml/file_paths.xml следующим образом:
Ответ 4
Если вы используете внутренний кеш, используйте его.
Ответ 5
Это тоже смущает меня.
Проблема заключается в атрибуте «path» в вашем XML файле.
Из этого документа FileProvider ‘path’ — это подкаталог, но в другом документе (камера/фотобаза) «путь» — полный путь.
Я просто изменяю этот «путь» на полный путь, и он просто работает.
Ответ 6
Проверьте, сколько хранилищ вашего устройства предлагает — совместное использование файлов из вторичного хранилища не поддерживается. Посмотрите на источник FileProvider.java (из поддержки-core-utils 25.3.1):
Таким образом, они берут только первое хранилище.
Кроме того, вы можете видеть, что getExternalCacheDirs() используется для получения списка хранилищ через интерфейс ContextCompat . См. документация в своих пределах (он сказал, чтобы не распознавать USB-вспышки, например). Лучше всего сделать отладочный вывод списка хранилищ из этого API самостоятельно, чтобы вы могли проверить, что путь к хранилищу соответствует пути, переданному в getUriForFile() .
Ответ 7
Я бы опоздал, но нашел решение для него. Работая отлично, я просто изменил файл XML пути:
Ответ 8
Имейте в виду, что внешний путь не указывает на ваше вторичное хранилище, а также «съемное хранилище» (несмотря на название «внешний»). Если вы получаете «Не удалось найти настроенный root», вы можете добавить эту строку в свой XML файл.
Ответ 9
Ничто из этого не сработало для меня. Единственный подход, который работает, заключается не в том, чтобы объявить явный путь в xml. Так сделайте это и будьте счастливы:
Ответ 10
Я уверен, что я опоздал на вечеринку, но ниже работал для меня.
Ответ 11
Моя проблема заключалась в том, что у меня были перекрывающиеся имена в пути к файлам для разных типов, например:
После того, как я изменил имена («cached_files»), чтобы быть уникальными, я избавился от этой ошибки. Я предполагаю, что эти пути хранятся в некоторых HashMap или что-то, что не позволяет дублировать.
Ответ 12
Потерял 2 недели, пытаясь найти решение. Если вы прибываете сюда после того, как попробуйте что-нибудь выше:
1 — Убедитесь, что ваш поставщик тегов находится внутри приложения тегов
2 — Если вы безуспешно пробуете много путей, попробуйте следующее:
Проверьте это, если камера работает, затем начните устранять некоторые строки и продолжайте тестирование.
3 — Не забудьте проверить, активирована ли камера в вашем эмуляторе.
Ответ 13
Это работало и для меня. Вместо того, чтобы давать полный путь, я дал путь = «Картинки», и он отлично работал.
Ответ 14
Что я сделал для этого —
filepaths.xml(разрешить FileProvider обмениваться всеми файлами, находящимися в каталоге внешних файлов приложения)
и в классе java —
Ответ 15
ни один из вышеперечисленных не работал для меня, после нескольких часов отладки я узнал, что проблема в createImageFile() , в частности absolute path и relative path
Я предполагаю, что вы, ребята, используете официальное руководство по Android для фотосъемки. https://developer.android.com/training/camera/photobasics
Обратите внимание на storageDir , это место, где будет создан файл. Поэтому, чтобы получить абсолютный путь к этому файлу, я просто использую image.getAbsolutePath() , этот путь будет использоваться в onActivityResult если вам нужно изображение растрового изображения после съемки
ниже file_path.xml , просто используйте . так что он использует абсолютный путь
и если вам нужно растровое изображение после съемки
Ответ 16
Я потратил 5 часов на это..
Я перепробовал все методы, описанные выше, но это зависит от того, какое хранилище использует ваше приложение.
Проверьте документацию, прежде чем пытаться коды.
В моем случае, так как files-path будет Context.getFilesDir() . Самое Context.getFilesDir() что Context.getFilesDir() друг на друга.
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
поэтому тег должен быть
. files-path name=»app_imageDir» path=»../app_imageDir/».
Тогда это работает!
Ответ 17
Я получаю эту ошибку Failed to find configured root that contains.
Следующая работа решает мою проблему
Рез /XML/file_paths.xml
AndroidManifest.xml
ActivityClass.java
Ответ 18
Официальный документ Android говорит, что file_paths.xml должен иметь:
Но чтобы заставить его работать в последнем андроиде, в конце пути должно быть «/», например:
Ответ 19
Следующее изменение файла xml file_paths сработало для меня.
Ответ 20
Я наконец нашел свою проблему. Я описал это в этой ссылке.
моя проблема заключалась в различии между идентификатором приложения в режиме отладки и выпуска
Ответ 21
Это зависит от того, какое хранилище вы хотите делать, ВНУТРЕННЕЕ или ВНЕШНЕЕ
для ВНЕШНЕГО ХРАНЕНИЯ
но для ВНУТРЕННЕГО ХРАНЕНИЯ, будьте осторожны с этим путем, потому что он использует метод getFilesDir(), который означает, что ваш файл будет находиться в корневом каталоге приложения («/»)
Таким образом, ваш файл поставщика должен выглядеть следующим образом:
Ответ 22
Я вижу, что по крайней мере вы не предоставляете тот же путь, что и другие, в file_paths.xml. Поэтому, пожалуйста, убедитесь, что вы указали то же самое имя или путь пакета в трех местах, включая:
- android:authorities атрибут в манифесте
- path атрибут в file_paths.xml
- authority при вызове FileProvider.getUriForFile().
Ответ 23
- Для пользователей Xamarin.Android
Это также может быть результатом не обновления пакетов поддержки при настройке Android 7.1, 8.0+. Обновите их до v25.4.0.2 +, и эта конкретная ошибка может исчезнуть (если вы правильно настроили файл file_path, как утверждают другие).
Предоставление контекста: я переключился на таргетинг Oreo из Нуга в приложение Xamarin.Forms и сделайте снимок с Xam.Plugin.Mediaначалось сбой с указанным выше сообщением об ошибке, поэтому обновление пакетов помогло нормально.
Ответ 24
Я заметил, что политика или поведение файла path.xml изменилось между библиотекой поддержки 26 и 27. Для захвата изображения с камеры я увидел следующие изменения:
С 26 я должен был использовать и полный путь, указанный в аргументе path .
С 27 я должен был использовать и только подпапку в аргументе path .
Итак, что конкретно работало для меня в Support Library 27, поскольку файл path.xml был
Ответ 25
У меня была та же проблема, я попробовал приведенный ниже код для его работы.
1.Создать Xmlfile: provider_paths
2. Файл Mainfest
3.В файле Java.
Ответ 26
Привет друзья Попробуйте это
1) Как объявить 2 поставщика файлов в манифесте.
2) Первый провайдер для загрузки файла
3) второй провайдер, используемый для камеры и галерей
ШАГ 1
Provider_paths.xml
Второй провайдер
file_path.xml
.Utils.MyFileProvider
Создать класс MyFileProvider (только создать класс, который не объявляет какой-либо метод)
Когда вы использовали File Provider used (.fileprovider), это имя использовалось для изображения (.provider).
ЕСЛИ какая-либо проблема. Чтобы понять этот код, вы можете связаться по адресу [email protected] Я помогу вам.
Ответ 27
Если ничего не помогает, и вы получаете ошибку
затем попробуйте изменить некоторую строку, например:
что странно, поскольку папка, к которой я обращаюсь, — это /images .
Ответ 28
Проблема может быть не только в пути XML.
Следующее — мое исправление:
Просмотр корневого курса в android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile() :
Это означает, что mRoots должен содержать тег запрошенного URI. Поэтому я пишу код для печати mRoots и тега mRoots , а затем легко найти теги не совпадают.
Получается, что установка полномочий провайдера как $
Ответ 29
Вам нужно изменить файл xml file_paths.xml из
Ответ 30
Моя проблема была file_paths.xml Имя файла: я file_paths.xml в res/xml, в то время как для ресурса был задан файл provider_paths.xml в манифесте:
Я изменил provider_paths на file_paths и проблема решена.
Источник