FileProvider - IllegalArgumentException: Gagal untuk menemukan akar dikonfigurasi

I'm mencoba untuk mengambil gambar dengan kamera, tetapi saya'm mendapatkan error berikut:

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>

Jawa:

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>

Aku sudah mencari sepanjang hari tentang kesalahan ini dan mencoba untuk memahami FileProvider, tapi saya tidak tahu apa pesan kesalahan ini mencoba untuk memberitahu saya. Jika anda ingin info lebih lanjut/kode, menulis saya di komentar.

Mengomentari pertanyaan (3)
Larutan

File anda yang disimpan di bawah getExternalFilesDir(). Bahwa peta untuk <eksternal-file-path>, bukan <file-path>. Juga, anda path file tidak mengandung images/ di dalamnya, sehingga path atribut XML anda adalah valid.

Ganti res/xml/file_paths.xml dengan:

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

Komentar (16)

Ini dapat mengatasi setiap masalah: Semua kategori yang ditambahkan sehingga anda don't perlu khawatir tentang folder path. Mengganti res/xml/file_paths.xml dengan:

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




<Files-path
    name="files"
    path="." />
Komentar (7)

Punya masalah yang sama setelah diaktifkan rasa (dev, tahap).

Sebelum saya rasa jalan sumber daya tampak seperti ini:

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

Setelah ditambahkan android:pemerintah="${masalah}.fileprovider" dalam Mewujudkan appId pl.myapp.dev atau pl.myapp.tahap tergantung pada rasa dan aplikasi mulai menerjang. Saya dihapus path lengkap dan digantikan dengan dot dan segala sesuatu mulai bekerja.

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

Komentar (6)

Jika anda menggunakan cache internal kemudian digunakan.

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

Komentar (1)

Hilang 2 minggu mencoba untuk menemukan beberapa solusi... Jika anda tiba di sini setelah mencoba everthing di atas:

1 - Pastikan jika anda tag penyedia berada di dalam tag aplikasi




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


2 - Jika anda mencoba banyak jalan-jalan tanpa keberhasilan, kemudian tes dengan ini:

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




  <Files-path name="my_images" path="/" />
  <Files-path name="my_images" path="myfile/"/>
  <Files-path name="files" path="." />














Tes ini, jika kamera bekerja, kemudian mulai menghilangkan beberapa baris dan melanjutkan pengujian...

3 - Tidak lupa memverifikasi jika kamera yang actived di emulator anda.

Komentar (2)

Ini membingungkan saya sedikit terlalu.

Masalahnya adalah pada "jalan" atribut di file xml.

Dari dokumen ini FileProvider 'jalan' adalah sebuah subdirektori, tapi dalam dokumen yang lain (kamera/photobasics) ditampilkan 'jalan' adalah path lengkap.

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

Aku hanya perubahan ini 'jalan' untuk path lengkap dan hanya bekerja.

Komentar (0)

Aku akan terlambat tapi saya menemukan solusi untuk itu.Bekerja dengan baik untuk saya, saya hanya mengubah path file XML untuk:

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

Komentar (2)

Memeriksa berapa banyak ruang penyimpanan perangkat anda menawarkan berbagi file dari penyimpanan sekunder adalah tidak didukung. Lihatlah FileProvider.java sumber (dari support-core-utils 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];
                }
            }

Jadi, mereka hanya mengambil yang pertama penyimpanan.

Juga, anda dapat melihat bahwa getExternalCacheDirs() digunakan untuk mendapatkan daftar dari lumbung melalui ContextCompat antarmuka. Lihat documentation untuk batas-batasnya (it's mengatakan untuk tidak mengenali USB Berkedip misalnya). Yang terbaik adalah untuk membuat beberapa debug output dari daftar lumbung dari API ini pada anda sendiri, sehingga anda dapat memeriksa bahwa jalan untuk penyimpanan sesuai dengan jalan yang dilalui untuk getUriForFile().

Ada's sudah tiket ditugaskan (seperti untuk 06-2017) di Google's issue tracker, meminta untuk mendukung lebih dari satu mobil. Akhirnya, saya menemukan JADI pertanyaan ini juga.

Komentar (1)

Saya yakin saya terlambat ke pesta tapi di bawah ini bekerja untuk saya. ``<?xml version="1.0" encoding="utf-8"?>

<jalan>
Komentar (1)

Diketahui bahwa eksternal-jalan tidak menunjuk ke penyimpanan sekunder, alias "removable storage" (meskipun nama "eksternal"). Jika anda'mendapatkan "Gagal untuk menemukan akar dikonfigurasi" anda dapat menambahkan baris ini ke file XML.

Lihat lebih detail di sini https://stackoverflow.com/questions/40318116/fileprovider-and-secondary-external-storage

Komentar (0)

Tak satu pun dari ini bekerja untuk saya. Satu-satunya pendekatan yang berhasil adalah tidak untuk menyatakan eksplisit jalan di xml. Jadi melakukan hal ini dan menjadi bahagia:

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

Di sini juga memiliki excellent tutorial tentang pertanyaan ini: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s

Komentar (0)

Masalah saya adalah bahwa saya telah tumpang tindih nama path file untuk jenis yang berbeda, seperti ini:


Setelah saya mengubah nama ("cached_files") untuk menjadi unik, aku menyingkirkan kesalahan. Dugaan saya adalah bahwa jalur-jalur tersebut disimpan di beberapa HashMap atau sesuatu yang tidak memungkinkan duplikat.

Komentar (0)

Saya telah menghabiskan 5 jam untuk ini..

Saya telah mencoba semua metode di atas, tetapi itu tergantung pada apa yang storeage aplikasi anda saat ini menggunakan.

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

Periksa dokumentasi sebelum mencoba kode-kode.

Dalam kasus saya sejak file-path sub direktori akan Konteks.getFilesDir(). Funky hal itu Konteks.getFilesDir() catatan satu sama lain subdirektori.

apa yang saya cari

data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png

Context.getFilesDir()

kembali /data/user/0/com.psh.mTest/file

jadi tag harus

....file-path name="app_imageDir" path="../app_imageDir/" ......

Kemudian ia bekerja!!

Komentar (1)

Ini Bekerja untuk saya juga.Bukannya memberikan path lengkap saya berikan path="Gambar" dan itu bekerja dengan baik.


<?xml version="1.0" encoding="utf-8"?>
 <paths>
Komentar (0)

Saya mendapatkan error ini Gagal untuk menemukan akar dikonfigurasi yang berisi...

Kerja berikut ini menyelesaikan masalah saya

res/xml/file_paths.xml ``

<jalan xmlns:android="http://schemas.android.com/apk/res/android">
Komentar (0)

di atas tidak ada yang bekerja untuk saya, setelah beberapa jam debugging saya menemukan bahwa masalahnya adalah di createImageFile(), khususnya absolut vs path relatif

Saya berasumsi bahwa kalian menggunakan Android resmi panduan untuk mengambil foto. 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;
    }

Perhatikan storageDir, ini adalah lokasi di mana file akan dibuat. Jadi dalam rangka untuk mendapatkan absolute path dari file ini, saya hanya menggunakan gambar.getAbsolutePath(), jalan ini akan digunakan di onActivityResult jika anda membutuhkan gambar Bitmap setelah mengambil foto

di bawah ini adalah file_path.xml, hanya menggunakan . sehingga menggunakan path absolut

<paths>

dan jika anda membutuhkan bitmap setelah mengambil foto

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();
        }
    }
Komentar (0)

Apa yang saya lakukan untuk memecahkan masalah ini -

AndroidManifest.xml


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

filepaths.xml (Memungkinkan FileProvider untuk berbagi semua file yang ada di dalam aplikasi's file eksternal direktori)

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

dan di jawa kelas -

Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);
Komentar (0)

saya punya masalah yang sama, saya mencoba kode di bawah ini untuk bekerja.

1.Membuat Xmlfile : provider_paths

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <Files-path name="my_images" path="myfile/"/>

2. Mainfest file


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

3.Di file 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);
Komentar (0)

Android resmi dokumen kata file_paths.xml harus memiliki:

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

Tetapi untuk membuatnya bekerja di android terbaru harus ada "/" di ujung jalan, seperti ini:

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

Komentar (0)

Berikut perubahan dalam xml file_paths file yang bekerja untuk saya.


Komentar (0)