Я'м пытаясь сделать снимок с камеры, но я'м получаю следующее сообщение об ошибке:
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, но я понятия не имею, что это сообщение об ошибке пытается сказать мне. Если вы хотите получить больше информации/кода, напишите Мне в комментарии.
Ваш файл хранится под getExternalFilesDir(). Что карты в
<внешнее-файлы-путь>, а не
<файлы-путь>. Кроме того, ваш путь к файлу не содержит изображений/ в нем, так что атрибут
путь` в ваш XML является недопустимым.
Заменить res/xml/file_paths.xml` с:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="my_images" path="/" />
</paths>
Это может решить проблемы всякие: Все теги добавляются, так что вы Дон'т нужно беспокоиться о папках. Заменить res/xml/file_paths.xml с:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external"
path="." />
<external-files-path
name="external_files"
path="." />
<cache-path
name="cache"
path="." />
<external-cache-path
name="external_cache"
path="." />
<files-path
name="files"
path="." />
</paths>
Есть аналогичная проблема после вкусов включено (Дев, этап).
Перед ароматами мой путь к ресурсу выглядела так:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="my_images"
path="Android/data/pl.myapp/files/Pictures" />
</paths>
После того, как добавил Android:власти=" и${ид_приложения}.fileprovider и" в манифесте приложения был ЛП.приложение myapp.dev или ЛП.приложение myapp.стадии зависит от вкуса и приложение начал рушится. Я убрал полный путь и заменил его точка и все начало работать.
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="my_images"
path="." />
</paths>
Потеряли 2 недели пытаюсь найти какое-то решение... если вы приедете сюда после попробовать все выше:
1 - Проверьте, если ваш провайдер тегов внутри приложения тег
<application>
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.Pocidadao.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
2 - Если вы попробуете много путей без успеха, то тест с этим:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path name="cache" path="." />
<external-path name="external" path="." />
<root-path name="root" path="." />
<files-path name="my_images" path="/" />
<files-path name="my_images" path="myfile/"/>
<files-path name="files" path="." />
<external-path name="external_files" path="." />
<external-path name="images" path="Pictures" />
<external-path name="my_images" path="." />
<external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures" />
<external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures/" />
<external-files-path name="images" path="Pictures"/>
<external-files-path name="camera_image" path="Pictures/"/>
<external-files-path name="external_files" path="." />
<external-files-path name="my_images" path="my_images" />
<external-cache-path name="external_cache" path="." />
</paths>
Проверить это, если камера работает, то начать устранять некоторые линии и продолжить тестирование...
3 - Не забудьте проверить, если камера активируется в вашем эмуляторе.
Это смущает меня немного слишком.
Проблема на "Путь" и атрибутов в XML-файл.
Из этого документа FileProvider 'путь' - это подкаталог, но в другом документе (камеры/photobasics) показано 'путь' полный путь.
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
</paths>
Я просто меняю это 'путь' полный путь к файлу и он просто работает.
Проверьте, сколько хранилищ устройства предлагает - обмен файлами с внешнего хранилища не поддерживается. Посмотри на источник fileprovider.java (от support-основной пакет 25.3.1):
} else if (TAG_EXTERNAL_FILES.equals(tag)) {
File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
if (externalFilesDirs.length > 0) {
target = externalFilesDirs[0];
}
} else if (TAG_EXTERNAL_CACHE.equals(tag)) {
File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);
if (externalCacheDirs.length > 0) {
target = externalCacheDirs[0];
}
}
Итак, они берут только первая хранения.
Кроме того, вы можете видеть, что getExternalCacheDirs()
используется, чтобы получить список хранилищ через интерфейс ContextCompat. См. <а href="https://developer.android.com/reference/android/content/Context.html#getExternalCacheDirs()">documentation</a> за ее пределы (это's сказала, чтобы не признать, например, флешек). Лучше всего, чтобы сделать некоторые отладки в списке хранилищ от этого API на свой собственный, так что вы можете увидеть, что путь к играм хранения багажа в пути перешла к
getUriForFile()`.
Там'ы уже билет назначенный (как для 06-2017) в Google'ы трекера, с просьбой поддержать более одного хранилища. В конце концов, я нашел так что вопрос об этом, а также.
Я уверен, что я опоздала на вечеринку, но ниже работал для меня. ``<?XML-версия="и" и что quot кодировка="в кодировке UTF-8&;?&1.0 ГТ; <пути> <корень-путь имя="в корень" по пути=то".&и" /> </пути>
Следует помнить, что внешнее-путь не указывает на ваше вторичное хранилище, то " ака;съемными носителями и" (несмотря на название на "внешних" у). Если вы'вновь, как и"не удалось найти настроен корень" Вы можете добавить эту строку в XML-файл.
<root-path name="root" path="." />
Ознакомиться более детально здесь https://stackoverflow.com/questions/40318116/fileprovider-and-secondary-external-storage
Ничего из этого не работает для меня. Единственный подход, который работает не объявить явный путь в XML. Так сделайте это и будьте счастливы:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="." />
</paths>
Здесь также есть отличный учебник по этому поводу вопрос:
Моя проблема была в том, что у меня было перекрытие имен в пути к файлам различных типов, вроде этого:
<cache-path
name="cached_files"
path="." />
<external-cache-path
name="cached_files"
path="." />
После того, как я изменил имена ("в cached_files-то"), чтобы быть уникальным, я избавился от ошибки. Я думаю, что эти пути хранятся в некоторых HashMap или что-то не допускает дубликатов.
Я потратил 5 часов на это..
Я пробовал все вышеперечисленные методы, но это зависит от того, что storeageбыл ваше приложение используется в данный момент.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Ознакомьтесь с документацией перед тем, как пробовать коды.
В моем случае
с файлами-путь подкаталог "будет" контексте.getFilesDir(). Фанки вещь-это контекст.getFilesDir()
Примечания другом подкаталоге.
то, что я ищу-это
Context.getFilesDir()
возвращает `/данных/пользователей/0/ком.ПШ.мтест/файлы
так что тег должен быть
....файлы-путь имя="в app_imageDir на" Путь=" от../app_imageDir/то" ......
Затем он работает!!
Этот работал для меня.Вместо того, чтобы дать полный путь я дал путь="по фотографии" и он работал нормально.
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="images"
path="Pictures">
</external-files-path>
</paths>
Я получаю эту ошибку не удалось найти настроен корень, который содержит...
Следующим обойти решает мой вопрос
res/xml/file_paths.xml
<пути префиксом xmlns:Андроид="и http://schemas.android.com/apk/res/android"> <внешнее-путь имя="в СМИ" Путь=то".&и" /> </пути>
AndroidManifest.xml
<поставщик Android:имя="на Андроид.поддержка.В4.содержание.FileProvider и" андроид:власти=то"[имя_пакета] и" для Android:экспортированы=то"ложные"и андроид:=с" grantUriPermissions;правда" и> <мета-данные Android:имя="на Андроид.поддержка.FILE_PROVIDER_PATHS и" андроид:ресурс=" и я с XML/file_paths&@;> </мета-данных и GT; </поставщик>
ActivityClass.java
пустота shareImage() { Намерение намерение = новое намерение(умысел.ACTION_SEND); намерениях.setType("и изображения/*" - а); намерениях.putExtra ("намерением".EXTRA_STREAM, FileProvider.getUriForFile(это,"У ком.slappstudio.pencilsketchphotomaker" и, selectedFilePath)); startActivity(умысла.createChooser(намерения,метода getString(Р. строкой.string_share_with))); }
ни один из выше работал для меня
после нескольких часов отладки я выяснил, что проблема в createImageFile(), относительный путь конкретно
абсолютный путь` против ``
Я предполагаю, что вы используете официальный гид для Андроид для фотографирования. https://developer.android.com/training/camera/photobasics
private static File createImageFile(Context context) throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
Принять к сведению storageDir
, это место, где файл будет создан. Поэтому для того, чтобы получить абсолютный путь этого файла, я просто использовать `изображения.getAbsolutePath (), этот путь будет использован в метод onActivityResult, если вам нужны растровые изображения после фотографирования
ниже находится file_path.xml`, просто используйте``. так что он использует абсолютный путь
<paths>
<external-path
name="my_images"
path="." />
</paths>
и если вам нужно растровое изображение после фотографирования
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bitmap bmp = null;
try {
bmp = BitmapFactory.decodeFile(mCurrentPhotoPath);
} catch (Exception e) {
e.printStackTrace();
}
}
Что я сделал, чтобы решить эту -
AndroidManifest.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>
</provider>
filepaths.xml каталог (позволяя FileProvider поделиться все файлы, которые находятся внутри приложения's внешний файлов)
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="files"
path="/" />
</paths>
и в Java-класс
Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);
У меня была такая же проблема, я пробовал ниже код для своей работы.
1.Создать XML-файл : provider_paths
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="my_images" path="myfile/"/>
</paths>
2. Файл Mainfest
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.ril.learnet.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
3.В Java-файл.
File file = new File(getActivity().getFilesDir(), "myfile");
if (!file.exists()) {
file.mkdirs();
}
String destPath = file.getPath() + File.separator + attachmentsListBean.getFileName();
file mfile = new File(destPath);
Uri path;
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
path = FileProvider.getUriForFile(AppController.getInstance().getApplicationContext(), AppController.getInstance().getApplicationContext().getPackageName() + ".provider", mfile );
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
path = Uri.fromFile(mfile);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(path, "image/*");
getActivity().startActivity(intent);
Официальный документ андроид говорит file_paths.xml должен иметь:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images"
path="Android/data/com.example.package.name/files/Pictures" />
</paths>
но чтобы заставить его работать в последней версии должен быть и"/" и в конце пути, как это:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images"
path="Android/data/com.example.package.name/files/Pictures/" />
</paths>
Следующие изменения в XML-файл file_paths работал для меня.
<external-files-path name="my_images" path="Pictures"/>
<external-files-path name="my_movies" path="Movies"/>