Я пытаюсь сделать снимок с помощью камеры, но получаю следующую ошибку:
FATAL EXCEPTION: main
Process: com.example.marek.myapplication, PID: 6747
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.marek.myapplication/files/Pictures/JPEG_20170228_175633_470124220.jpg
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
at com.example.marek.myapplication.MainActivity.dispatchTakePictureIntent(MainActivity.java:56)
at com.example.marek.myapplication.MainActivity.access$100(MainActivity.java:22)
at com.example.marek.myapplication.MainActivity$1.onClick(MainActivity.java:35)
AndroidManifest.xml:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.marek.myapplication.fileprovider"
android:enabled="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
Ява:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Toast.makeText(getApplicationContext(), "Error while saving picture.", Toast.LENGTH_LONG).show();
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.marek.myapplication.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="my_images" path="images/"/>
</paths>
Я искал весь день об этой ошибке и пытался понять FileProvider
, но я понятия не имею, что пытается сказать мне это сообщение об ошибке. Если вы хотите больше информации / кода, напишите мне в комментарии.
android
android-fileprovider
Pivoman
источник
источник
Ответы:
Ваш файл хранится в
getExternalFilesDir()
. Это карты<external-files-path>
, а не<files-path>
. Кроме того, ваш путь к файлу не содержитсяimages/
в нем, поэтомуpath
атрибут в вашем XML недействителен.Заменить
res/xml/file_paths.xml
на:ОБНОВЛЕНИЕ 2020 МАРТ 13
Путь провайдера для конкретного пути в следующем виде:
<files-path/>
->Context.getFilesDir()
<cache-path/>
->Context.getCacheDir()
<external-path/>
->Environment.getExternalStorageDirectory()
<external-files-path/>
->Context.getExternalFilesDir(String)
<external-cache-path/>
->Context.getExternalCacheDir()
<external-media-path/>
->Context.getExternalMediaDirs()
Ссылка: https://developer.android.com/reference/androidx/core/content/FileProvider
источник
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
Этоpath="."
то, что я нашел в своем собственном исследовании, чтобы остаться на высшем уровне. Если вы поближе познакомитесь с FileProvider, вы увидите, что путь, прочитанный из XML, канонизируется. Мое лучшее предположение, чтоContextCompat#getExternalFilesDirs
вернул ноль @line 616 (v26.0.1), поэтому PathStrategy не была зарегистрирована. Это произошло на устройстве Huawei.Это может решить любую проблему: все теги добавлены, поэтому вам не нужно беспокоиться о пути к папкам. Замените res / xml / file_paths.xml на:
источник
Возникла похожая проблема после включения ароматов (dev, stage).
До появления ароматов мой ресурсный путь выглядел так:
После того, как в приложении Manifest был добавлен параметр android: authority = "$ {applicationId} .fileprovider", значение pl.myapp.dev или pl.myapp.stage зависело от вкуса и сбоя приложения. Я удалил полный путь и заменил его точкой, и все начало работать.
источник
Если вы используете внутренний кеш, используйте.
источник
Потерял 2 недели, пытаясь найти решение ... Если вы прибываете сюда после того, как попробуйте что-нибудь выше:
1 - Убедитесь, что ваш поставщик тегов находится внутри приложения тегов
2 - Если вы безуспешно пробуете много путей, попробуйте следующее:
Проверьте это, если камера работает, затем начните устранять некоторые строки и продолжайте тестирование ...
3 - Не забудьте проверить, активирована ли камера в вашем эмуляторе.
источник
Я уверен, что я опоздал на вечеринку, но ниже работал для меня.
источник
Это меня немного смущает.
Проблема в атрибуте "путь" в вашем XML-файле.
Из этого документа FileProvider 'path' является подкаталогом, но в другом документе (камера / основные сведения) показанный 'path' является полным путем.
Я просто изменяю этот «путь» на полный путь, и он просто работает.
источник
Я бы опоздал, но я нашел решение для этого. Работая хорошо для меня, я просто изменил путь XML-файл на:
источник
provider_paths.xml
дает предупреждение проверки "Элемент root-path здесь не разрешен".Имейте в виду, что external-path не указывает на ваше вторичное хранилище, то есть «съемное хранилище» (несмотря на название «external»). Если вы получаете «Не удалось найти настроенный корень», вы можете добавить эту строку в свой XML-файл.
Подробнее смотрите здесь FileProvider и вторичное внешнее хранилище
источник
Проверьте, сколько хранилищ предлагает ваше устройство - общий доступ к файлам из вторичного хранилища не поддерживается. Посмотрите на
FileProvider.java
источник (из support-core-utils 25.3.1 ):Итак, они занимают только первое хранилище.
Также вы можете видеть, что
getExternalCacheDirs()
используется для получения списка хранилищ черезContextCompat
интерфейс. См. Документацию по ее ограничениям (например, сказано не распознавать USB-флешки). Лучше всего сделать отладочный вывод списка хранилищ из этого API самостоятельно, чтобы вы могли проверить, что путь к хранилищу соответствует пути, переданному вgetUriForFile()
.В системе отслеживания проблем Google уже назначен тикет (на 06-2017) с просьбой поддержать более одного хранилища. В конце концов, я также нашел ТАК вопрос по этому вопросу .
источник
Я потратил 5 часов на это ..
Я перепробовал все методы, описанные выше, но это зависит от того, какое хранилище использует ваше приложение.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Проверьте документацию, прежде чем пытаться коды.
В моем случае, так как
files-path
подкаталог будетContext.getFilesDir()
. Самое интересное, что онContext.getFilesDir()
замечает друг друга в подкаталоге.что я ищу
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
возвращается
/data/user/0/com.psh.mTest/files
поэтому тег должен быть
....
files-path name="app_imageDir" path="../app_imageDir/" ......
Тогда это работает!
источник
getExternalStorageDirectory()
и я должен был<external-path>
<files-path>
Ничто из этого не сработало для меня. Единственный подход, который работает, это не объявлять явный путь в XML. Так что делай это и будь счастлив
Здесь также есть отличное руководство по этому вопросу: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
источник
Моя проблема заключалась в том, что у меня были перекрывающиеся имена в путях к файлам для разных типов, например так:
После того как я изменил имена ("cached_files") на уникальные, я избавился от ошибки. Я предполагаю, что эти пути хранятся в некотором HashMap или что-то, что не допускает дублирования.
источник
Это работало и для меня. Вместо того, чтобы указывать полный путь, я указывал путь = "Картинки", и он работал нормально.
источник
Что я сделал, чтобы решить это -
AndroidManifest.xml
filepaths.xml (позволяя FileProvider совместно использовать все файлы, которые находятся в каталоге внешних файлов приложения)
и в классе Java -
источник
Это зависит от того, какой тип хранилища вы хотите сделать, ВНУТРЕННИЙ или ВНЕШНИЙ.
для ВНЕШНЕГО ХРАНЕНИЯ
но для ВНУТРЕННЕГО ХРАНЕНИЯ, будьте осторожны с путем, потому что он использует метод getFilesDir (), который означает, что ваш файл будет находиться в корневом каталоге приложения ("/")
Таким образом, ваш файл провайдера должен быть таким:
источник
Ни один из выше работал для меня, после нескольких часов отладки я обнаружил, что проблема заключается в
createImageFile()
, в частности ,absolute path
противrelative path
Я предполагаю, что вы, ребята, используете официальное руководство по Android для фотографирования. https://developer.android.com/training/camera/photobasics
Обратите внимание
storageDir
, это место, где будет создан файл. Поэтому, чтобы получить абсолютный путь к этому файлу, я просто используюimage.getAbsolutePath()
этот путь,onActivityResult
если вам понадобится растровое изображение после съемки фотографии.ниже
file_path.xml
, просто используйте,.
чтобы он использовал абсолютный путьи если вам нужно растровое изображение после съемки
источник
Я получаю эту ошибку
Failed to find configured root that contains...
Следующая работа решает мою проблему
Рез / XML / file_paths.xml
AndroidManifest.xml
ActivityClass.java
источник
Официальный документ Android гласит, что file_paths.xml должен иметь:
источник
Следующее изменение в файле xml file_paths сработало для меня.
источник
1. Создайте Xmlfile: provider_paths
2. Файл Mainfest
3.В вашем Java-файле.
источник
Если ничего не помогает и вы получаете ошибку
затем попробуйте изменить строку, например:
чтобы:
и в XML-файле:
что странно, так как папка, к которой у меня есть доступ
/images
.источник
Моя проблема была неверно названа : я создаю
file_paths.xml
в res / xml, в то время как ресурс был установленprovider_paths.xml
в Manifest:Я поменял
provider_paths
наfile_paths
и проблема решена.источник
Если ваш путь к файлу такой как / storage / emulated / 0 / "yourfile"
вам просто нужно изменить ваш FileProvider xml
затем вызовите эту функцию, когда вам нужно поделиться файлом
это работает на Android M ~ Pie
источник
Я вижу, что по крайней мере вы не указываете тот же путь, что и другие, в файле file_paths.xml. Поэтому, пожалуйста, убедитесь, что вы указали одно и то же имя пакета или путь в 3 местах, включая:
android:authorities
атрибут в манифестеpath
атрибут в file_paths.xmlauthority
аргумент при вызове FileProvider.getUriForFile ().источник
Это также может быть результатом отсутствия обновления пакетов поддержки при таргетинге на Android 7.1, 8.0+. Обновите их до v25.4.0.2 +, и эта конкретная ошибка может исчезнуть (если вы правильно настроили файл file_path, как указано другими).
источник
Я заметил, что политика или поведение в отношении
path.xml
файла изменились между библиотекой поддержки 26 и 27. Для захвата изображения с камеры я увидел следующие изменения:С 26 мне пришлось использовать
<external-path>
и полный путь, указанный вpath
аргументе.С 27 мне пришлось использовать
<external-files-path>
только подпапку вpath
аргументе.Так что конкретно работало для меня с Support Library 27, так как
path.xml
файл былисточник
Здравствуйте, друзья Попробуйте это
1) Как объявить 2 файла провайдера в манифесте.
2) Первый провайдер для файла Скачать
3) второй провайдер используется для камеры и галереи
ШАГ 1
Provider_paths.xml
Второй провайдер
file_path.xml
.Utils.MyFileProvider
Создать класс MyFileProvider (только Создать класс без какого-либо метода объявления)
Когда вы использовали File Provider (.fileprovider), это имя и вы использовали для изображения (.provider).
Если у вас возникли проблемы с пониманием этого кода, вы можете связаться по адресу rp1741995@gmail.com, и я вам помогу.
источник
Проблема может быть не только в пути XML.
Следующее мое исправление:
Изучение корневого курса в
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Это средство
mRoots
должно содержать тег запрошенного URI. Поэтому я пишу код для печатиmRoots
и тег URI, а затем легко найти теги не совпадают .Получается, что устанавливать полномочия провайдера как
${applicationID}.provider
глупая идея ! Эти полномочия настолько распространены, что могут быть использованы другими провайдерами, что испортит путь!источник
Вам нужно изменить файл xml file_paths.xml из
в
источник