FileProvider - IllegalArgumentException: не удалось найти настроенный корневой

Я'м пытаясь сделать снимок с камеры, но я'м получаю следующее сообщение об ошибке:

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, но я понятия не имею, что это сообщение об ошибке пытается сказать мне. Если вы хотите получить больше информации/кода, напишите Мне в комментарии.

Комментарии к вопросу (3)
Решение

Ваш файл хранится под getExternalFilesDir(). Что карты в<внешнее-файлы-путь>, а не<файлы-путь>. Кроме того, ваш путь к файлу не содержит изображений/ в нем, так что атрибутпуть` в ваш XML является недопустимым.

Заменить res/xml/file_paths.xml` с:

<?xml version="1.0" encoding="utf-8"?>
<paths>

Комментарии (16)

Это может решить проблемы всякие: Все теги добавляются, так что вы Дон'т нужно беспокоиться о папках. Заменить res/xml/file_paths.xml с:

<?xml version="1.0" encoding="utf-8"?>
<paths>





Комментарии (7)

Есть аналогичная проблема после вкусов включено (Дев, этап).

Перед ароматами мой путь к ресурсу выглядела так:

<?xml version="1.0" encoding="utf-8"?>
<paths>

После того, как добавил Android:власти=" и${ид_приложения}.fileprovider и" в манифесте приложения был ЛП.приложение myapp.dev или ЛП.приложение myapp.стадии зависит от вкуса и приложение начал рушится. Я убрал полный путь и заменил его точка и все начало работать.

<?xml version="1.0" encoding="utf-8"?>
<paths>

Комментарии (6)

Если вы используете внутренний кэш потом использовать.

<paths xmlns:android="http://schemas.android.com/apk/res/android">

Комментарии (1)

Потеряли 2 недели пытаюсь найти какое-то решение... если вы приедете сюда после попробовать все выше:

1 - Проверьте, если ваш провайдер тегов внутри приложения тег




      <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths">


2 - Если вы попробуете много путей без успеха, то тест с этим:

<?xml version="1.0" encoding="utf-8"?>
<paths>





















Проверить это, если камера работает, то начать устранять некоторые линии и продолжить тестирование...

3 - Не забудьте проверить, если камера активируется в вашем эмуляторе.

Комментарии (2)

Это смущает меня немного слишком.

Проблема на "Путь" и атрибутов в XML-файл.

Из этого документа FileProvider 'путь' - это подкаталог, но в другом документе (камеры/photobasics) показано 'путь' полный путь.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

Я просто меняю это 'путь' полный путь к файлу и он просто работает.

Комментарии (0)

Я буду поздно, но я нашла решение для нее.Работает нормально для меня, я просто изменил пути файл XML:

 <?xml version="1.0" encoding="utf-8"?>
<paths>

Комментарии (2)

Проверьте, сколько хранилищ устройства предлагает - обмен файлами с внешнего хранилища не поддерживается. Посмотри на источник 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> за ее пределы (это&#39;s сказала, чтобы не признать, например, флешек). Лучше всего, чтобы сделать некоторые отладки в списке хранилищ от этого API на свой собственный, так что вы можете увидеть, что путь к играм хранения багажа в пути перешла кgetUriForFile()`.

Там'ы уже билет назначенный (как для 06-2017) в Google'ы трекера, с просьбой поддержать более одного хранилища. В конце концов, я нашел так что вопрос об этом, а также.

Комментарии (1)

Я уверен, что я опоздала на вечеринку, но ниже работал для меня. ``<?XML-версия="и" и что quot кодировка="в кодировке UTF-8&;?&1.0 ГТ; <пути> <корень-путь имя="в корень" по пути=то".&и" /> </пути>

Комментарии (1)

Следует помнить, что внешнее-путь не указывает на ваше вторичное хранилище, то &quot ака;съемными носителями и" (несмотря на название на "внешних" у). Если вы'вновь, как и"не удалось найти настроен корень" Вы можете добавить эту строку в XML-файл.

Ознакомиться более детально здесь https://stackoverflow.com/questions/40318116/fileprovider-and-secondary-external-storage

Комментарии (0)

Ничего из этого не работает для меня. Единственный подход, который работает не объявить явный путь в XML. Так сделайте это и будьте счастливы:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

Здесь также есть отличный учебник по этому поводу вопрос: https://www.youtube.com/watch?v=9ZxRTKvtfnY&Т=613s

Комментарии (0)

Моя проблема была в том, что у меня было перекрытие имен в пути к файлам различных типов, вроде этого:


После того, как я изменил имена ("в cached_files-то"), чтобы быть уникальным, я избавился от ошибки. Я думаю, что эти пути хранятся в некоторых HashMap или что-то не допускает дубликатов.

Комментарии (0)

Я потратил 5 часов на это..

Я пробовал все вышеперечисленные методы, но это зависит от того, что storeageбыл ваше приложение используется в данный момент.

https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri

Ознакомьтесь с документацией перед тем, как пробовать коды.

В моем случае с файлами-путь подкаталог "будет" контексте.getFilesDir(). Фанки вещь-это контекст.getFilesDir() Примечания другом подкаталоге.

то, что я ищу-это

данных/пользователей/0/ком.ПШ.мтест/app_imageDir/20181202101432629.ПНГ`

Context.getFilesDir()

возвращает `/данных/пользователей/0/ком.ПШ.мтест/файлы

так что тег должен быть

....файлы-путь имя="в app_imageDir на" Путь=" от../app_imageDir/то" ......

Затем он работает!!

Комментарии (1)

Этот работал для меня.Вместо того, чтобы дать полный путь я дал путь="по фотографии" и он работал нормально.


<?xml version="1.0" encoding="utf-8"?>
 <paths>
Комментарии (0)

Я получаю эту ошибку не удалось найти настроен корень, который содержит...

Следующим обойти решает мой вопрос

res/xml/file_paths.xml <пути префиксом xmlns:Андроид="и http://schemas.android.com/apk/res/android"> <внешнее-путь имя="в СМИ" Путь=то".&и" /> </пути> AndroidManifest.xml

<поставщик Android:имя="на Андроид.поддержка.В4.содержание.FileProvider и" андроид:власти=то"[имя_пакета] и" для Android:экспортированы=то"ложные"и андроид:=с&quot 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))); }

Комментарии (0)

ни один из выше работал для меня после нескольких часов отладки я выяснил, что проблема в 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>

и если вам нужно растровое изображение после фотографирования

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();
        }
    }
Комментарии (0)

Что я сделал, чтобы решить эту -

AndroidManifest.xml


            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths"/>

filepaths.xml каталог (позволяя FileProvider поделиться все файлы, которые находятся внутри приложения's внешний файлов)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

и в Java-класс

Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);
Комментарии (0)

У меня была такая же проблема, я пробовал ниже код для своей работы.

1.Создать XML-файл : provider_paths

<?xml version="1.0" encoding="utf-8"?>
<paths>

2. Файл Mainfest


            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>

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);
Комментарии (0)

Официальный документ андроид говорит file_paths.xml должен иметь:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">   

но чтобы заставить его работать в последней версии должен быть и"/" и в конце пути, как это:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">   

Комментарии (0)

Следующие изменения в XML-файл file_paths работал для меня.


Комментарии (0)