FileProvider - IllegalArgumentException: Gagal menemukan root yang dikonfigurasi


233

Saya mencoba mengambil gambar dengan kamera, tetapi saya mendapatkan kesalahan 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>

Saya mencari sepanjang hari tentang kesalahan ini dan mencoba memahami FileProvider, tetapi saya tidak tahu apa yang ingin disampaikan oleh pesan kesalahan ini kepada saya. Jika Anda ingin info lebih lanjut / kode, tulis saya di komentar.


2
Bisakah Anda juga menempelkan kode metode createImageFile?
Ankit Batra

Maaf, tapi saya membatalkan proyek ini dan saya tidak mengerjakannya lagi . Saya akan menerima jawaban paling favorit untuk "menutup" pertanyaan ini. Terima kasih untuk semua atas partisipasi dan saya harap ini membantu orang lain.
Pivoman

Berlari ke masalah yang sama. Menemukan solusi ini untuk mendapatkan pengaturan FileProvider dasar menggunakan proyek contoh github minimal: stackoverflow.com/a/48103567/2162226 . Ini menyediakan langkah-langkah yang filenya akan disalin (tanpa membuat perubahan) menjadi proyek mandiri lokal
Gene Bo

Masalah ini sekarang diperbaiki di Delphi 10.4: quality.embarcadero.com/browse/RSP-26950
Dave Nottage

Jawaban:


211

File Anda disimpan di bawah getExternalFilesDir(). Itu peta untuk <external-files-path>, bukan <files-path>. Juga, jalur file Anda tidak mengandung images/di dalamnya, sehingga pathatribut di XML Anda tidak valid.

Ganti res/xml/file_paths.xmldengan:

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

UPDATE 2020 MAR 13

Jalur penyedia untuk jalur tertentu sebagai berikut:

  • <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()

Ref: https://developer.android.com/reference/androidx/core/content/FileProvider


5
ok, saya menambahkan external-files-path, tetapi saya masih memiliki kesalahan yang sama: / Mungkin ada lebih banyak bug. Saya menggunakan perangkat android emulator, apakah saya harus membuat folder itu atau semacamnya?
Pivoman

22
"Atribut 'path' harus didefinisikan" kita tidak ada di sini path dalam konfigurasi.
blackjack

1
Saya mengalami masalah dengan beberapa jalur di Android 5. Hanya tersisa satu jalur, bukan 2.
ODAXY

3
Saya menerima satu laporan kerusakan (dari 50-100 perangkat, saya pikir) yang identik dengan ini. <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>Inilah path="."yang saya temukan dalam penelitian saya sendiri untuk tetap berada di tingkat atas. Jika Anda menelusuri FileProvider lebih dekat, Anda akan melihat bahwa jalur yang dibaca dari XML dikanonisasi. Tebakan terbaik saya adalah ContextCompat#getExternalFilesDirsmengembalikan null @ line 616 (v26.0.1), jadi PathStrategy tidak terdaftar. Ini terjadi pada perangkat Huawei.
androidguy

10
Alih-alih menggunakan <external-files-path saya mencoba <external-path dan berhasil.
Safeer

166

Ini dapat menyelesaikan masalah semua orang: Semua tag ditambahkan sehingga Anda tidak perlu khawatir tentang jalur folder. Ganti res / xml / file_paths.xml dengan:

<?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>

3
Solusi terbaik. Terima kasih.
Pawan Pillai

1
Solusi sederhana ... tapi untuk ini brilian! Saya menggunakan penyedia lalu saya memasukkan kemungkinan pengguna untuk mengubah direktori tujuan ... tidak ada yang berhasil lagi karena pada saat itu penyedia harus dinamis .... Anda menyelamatkan hari saya!
Bronz

1
menggunakan solusi ini dan kode mulai berfungsi. Menghapus kode yang tidak perlu dengan menguji yang mana yang berfungsi
Kartik

1
Anda menyimpan hari saya. Terima kasih banyak :-)
manjunath kallannavar

1
Great bekerja untuk saya, sebagai pelajar baru itu membuat saya sadar bahwa saya tidak mendapatkan dari file eksternal tetapi cache
Tony Merritt

82

Mendapat masalah serupa setelah mengaktifkan rasa (dev, stage).

Sebelum mencicipi sumber daya jalur saya tampak seperti ini:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
    name="my_images"
    path="Android/data/pl.myapp/files/Pictures" />
</paths>

Setelah menambahkan android: otoritas = "$ {applicationId} .fileprovider" di Manifest appId adalah pl.myapp.dev atau pl.myapp.stage tergantung pada rasa dan aplikasi mulai mogok. Saya menghapus path lengkap dan menggantinya dengan dot dan semuanya mulai bekerja.

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

7
Bekerja untukku. Terima kasih! Bagaimana Anda menghasilkan '.' notasi?
NightFury

2
@ antigravitasi dapatkah Anda memberikan referensi / dokumentasi dari solusi ini?
geekoraul

7
Adakah konsekuensi negatif dari solusi ini?
RediOne1

Bekerja untuk saya, terima kasih banyak.
Hiren

Ini harus menjadi jawaban yang diterima! Satu-satunya solusi yang berhasil
egorikem

43

Jika Anda menggunakan cache internal maka gunakan.

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache" path="/" />
</paths>

3
terima kasih, situasi saya: Saya ingin menginstal aplikasi yang disimpan dalam / data / data / pkg_name / file, jadi konfigurasi saya yang benar sebagai berikut: <files-path name = "files" path = "/" />
aolphn

25

Kehilangan 2 minggu mencoba mencari solusi ... Jika Anda tiba di sini setelah mencoba semua hal di atas:

1 - Verifikasi apakah penyedia tag Anda ada di dalam aplikasi tag

<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 - Jika Anda mencoba banyak jalan tanpa hasil, maka uji dengan ini:

<?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>

Uji ini, jika kamera berfungsi, maka mulailah menghilangkan beberapa garis dan melanjutkan pengujian ...

3 - Jangan lupa verifikasi apakah kamera diaktifkan di emulator Anda.


1
Terima kasih, ini berhasil untuk saya. Apakah perlu untuk menghapus jalur lain?
CodeSlave

22

Saya yakin saya terlambat ke pesta tetapi di bawah ini bekerja untuk saya.

<paths>
    <root-path name="root" path="." />
</paths>

Ini adalah langkah terakhir untuk membuat kode saya berfungsi juga! Terima kasih.
Dog Dogma

15

Ini sedikit membingungkan saya.

Masalahnya ada pada atribut "path" di file xml Anda.

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

<?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>

Saya hanya mengubah 'jalur' ini menjadi jalur penuh dan hanya berfungsi.


15

Saya akan terlambat tetapi saya menemukan solusi untuk itu. Bekerja dengan baik untuk saya, saya baru saja mengubah jalur file XML ke:

 <?xml version="1.0" encoding="utf-8"?>
<paths>
    <root-path name="root" path="." />
</paths>

1
Bagi saya ini provider_paths.xmlmemberikan peringatan inspeksi "Elemen root-path tidak diperbolehkan di sini".
Luis A. Florit

15

Ketahuilah bahwa jalur eksternal tidak menunjuk ke penyimpanan sekunder Anda, alias "penyimpanan yang dapat dilepas" (terlepas dari nama "eksternal"). Jika Anda mendapatkan "Gagal menemukan root yang dikonfigurasi" Anda dapat menambahkan baris ini ke file XML Anda.

<root-path name="root" path="." />

Lihat lebih detail di sini FileProvider dan penyimpanan eksternal sekunder


14

Periksa berapa banyak penyimpanan yang ditawarkan perangkat Anda - berbagi file dari penyimpanan sekunder tidak didukung. Lihat FileProvider.javasumber (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 penyimpanan pertama.

Anda juga dapat melihat yang getExternalCacheDirs()digunakan untuk mendapatkan daftar penyimpanan melalui ContextCompatantarmuka. Lihat dokumentasi untuk batasannya (misalnya, diberitahu untuk tidak mengenali USB Flash). Cara terbaik adalah membuat keluaran debug daftar penyimpanan dari API ini sendiri, sehingga Anda dapat memeriksa jalur penyimpanan yang cocok dengan jalur yang dilewati getUriForFile().

Sudah ada tiket yang ditetapkan (seperti untuk 06-2017) di pelacak masalah Google, meminta untuk mendukung lebih dari satu penyimpanan. Akhirnya, saya menemukan pertanyaan SO tentang ini juga.


1
Jawaban mendalam ini harus mendapatkan lebih banyak upvotes. Terima kasih telah mencari penyimpanan FileProvider apa yang sebenarnya mengenali.
LarsH

10

Saya telah menghabiskan 5 jam untuk ini ..

Saya telah mencoba semua metode di atas tetapi tergantung pada penyimpanan apa yang digunakan aplikasi Anda saat ini.

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

Periksa dokumentasi sebelum mencoba kode.

Dalam kasus saya sejak files-pathsub direktori akan Context.getFilesDir(). Yang funky adalah ia Context.getFilesDir()mencatat satu subdirektori lainnya.

apa yang saya cari adalah

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

Context.getFilesDir()

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

jadi tag seharusnya

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

Lalu berhasil !!


1
Terima kasih telah merujuk pada dokumentasi. Itu menuntun saya ke jawaban yang benar. Dalam kasus saya, file saya disimpan getExternalStorageDirectory()dan saya seharusnya memberi path dengan <external-path>tag alih-alih<files-path>
alierdogan7

Terima kasih atas jawaban spesifik ini pada path file. Itu banyak membantu. :)
arungiri_10

Ya itu berhasil !!! titik kuncinya adalah menentukan ".." di awal jalan, seperti jalan ini = "../ myDirectory /"
Robert Apikyan

9

Tak satu pun dari ini bekerja untuk saya. Satu-satunya pendekatan yang berfungsi adalah tidak mendeklarasikan jalur eksplisit dalam xml. Jadi lakukan ini dan berbahagialah:

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

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


7

Masalah saya adalah bahwa saya memiliki nama yang tumpang tindih di jalur file untuk berbagai jenis, seperti ini:

<cache-path
    name="cached_files"
    path="." />
<external-cache-path
    name="cached_files"
    path="." />

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


3

Apa yang saya lakukan untuk menyelesaikan ini -

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 (Mengizinkan FileProvider untuk membagikan semua file yang ada di dalam direktori file eksternal aplikasi)

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

dan di kelas java -

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

3

Ini bekerja untuk saya juga. Alih-alih memberikan path lengkap saya memberikan path = "Gambar" dan itu bekerja dengan baik.

<?xml version="1.0" encoding="utf-8"?>
 <paths>
  <external-files-path
    name="images"
    path="Pictures">
  </external-files-path>
 </paths>

2

Tergantung jenis penyimpanan yang ingin Anda lakukan, INTERNAL atau EKSTERNAL

untuk PENYIMPANAN EKSTERNAL

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

tetapi untuk PENYIMPANAN INTERNAL, hati-hati dengan path, karena menggunakan metode getFilesDir () yang berarti bahwa file Anda akan berada di direktori root untuk aplikasi ("/")

  File storeDir = getFilesDir(); // path "/"

Jadi file penyedia Anda harus seperti ini:

<paths>
    <files-path name="my_images" path="/" />
</paths>

Semua contoh menganggap bahwa pengguna menggunakan penyimpanan eksternal. Saya membutuhkan bantuan dengan penyimpanan internal dan butuh berjam-jam untuk menemukan jawaban ini. Terima kasih.
zeeshan

2

tidak ada yang di atas bekerja untuk saya, setelah beberapa jam men-debug saya mengetahui bahwa masalahnya ada di createImageFile(), khususnya absolute pathvsrelative path

Saya berasumsi bahwa kalian menggunakan panduan Android resmi 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 untuk mendapatkan path absolut dari file ini, saya cukup menggunakan image.getAbsolutePath(), path ini akan digunakan onActivityResultjika Anda membutuhkan gambar Bitmap setelah mengambil foto

di bawah ini adalah file_path.xml, cukup gunakan .sehingga menggunakan jalur absolut

<paths>
    <external-path
        name="my_images"
        path="." />
</paths>

dan jika Anda memerlukan 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();
        }
    }

2

Saya mendapatkan kesalahan ini Failed to find configured root that contains...

Pekerjaan berikut ini menyelesaikan masalah saya

res / xml / file_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="media" path="." />
</paths>

AndroidManifest.xml

<provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="[PACKAGE_NAME]"
      android:exported="false"
      android:grantUriPermissions="true">
         <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">
         </meta-data>
</provider>

ActivityClass.java

void shareImage() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,"com.slappstudio.pencilsketchphotomaker", selectedFilePath));
        startActivity(Intent.createChooser(intent,getString(R.string.string_share_with)));
    }

1

Dokumen resmi Android mengatakan file_paths.xml seharusnya memiliki:

<?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>

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">   
    <external-path name="my_images"    
        path="Android/data/com.example.package.name/files/Pictures/" />
</paths>

1

Perubahan berikut dalam file xml file_paths bekerja untuk saya.

 <external-files-path name="my_images" path="Pictures"/>
 <external-files-path name="my_movies" path="Movies"/>

1

Saya memiliki masalah yang sama, saya mencoba kode di bawah ini untuk berfungsi.

1.Buat Xmlfile: provider_paths

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

2. File 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. Dalam file Java Anda.

      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);

1

Jika tidak ada yang membantu dan Anda mendapatkan kesalahan

failed to find configured root that contains /data/data/...

lalu coba ubah beberapa baris seperti:

File directory = thisActivity.getDir("images", Context.MODE_PRIVATE);

untuk:

File directory = new File(thisActivity.getFilesDir(), "images");

dan dalam file xml:

<files-path name="files" path="." />

yang aneh, karena folder yang saya akses adalah /images.


Beralih dari .getDir ke .getFilesDir membantu saya. Terima kasih!
Dmitriy Pavlukhin

1

Masalah Saya Salah Nama File : Saya Buat di file_paths.xmlbawah res / xml sementara sumber daya ditetapkan provider_paths.xmldi Manifest:

<provider
        android:authorities="ir.aghigh.radio.fileprovider"
        android:name="android.support.v4.content.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

Saya berubah provider_pathsmenjadi file_pathsdan memecahkan masalah.


1

Jika path file Anda seperti / storage / emulated / 0 / "file Anda"

Anda hanya perlu memodifikasi FileProvider xml Anda

<paths>
    <external-path name="external" path="." />
</paths>

lalu panggil fungsi ini saat Anda perlu berbagi file

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                    Uri fileUri = FileProvider.getUriForFile(getContext(),
                            "com.example.myapp.fileprovider",
                            file);
                    sharingIntent.setType("*/*"); // any flie type
                    sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
                    startActivity(Intent.createChooser(sharingIntent, "Share file"));

ini bekerja di Android M ~ Pie


Ini berhasil! Tetapi dapatkah Anda menjelaskan mengapa kami menggunakan path = "." bukannya path = "DCIM", "Pictures" ...?
Hoang Lam

@ Hoang Lam Perbedaannya adalah apakah Anda perlu menentukan direktori, dalam contoh saya Anda dapat mengakses semua
malas

0

Saya melihat bahwa setidaknya Anda tidak memberikan jalur yang sama dengan yang lain di file_paths.xml. Jadi, pastikan Anda memberikan nama atau jalur paket yang sama persis di 3 tempat termasuk:

  • android:authorities atribut dalam manifes
  • path atribut dalam file_paths.xml
  • authority argumen saat memanggil FileProvider.getUriForFile ().

0
  • Untuk pengguna Xamarin. Android

Ini juga bisa menjadi hasil dari tidak memperbarui paket dukungan Anda ketika menargetkan Android 7.1, 8.0+. Perbarui mereka ke v25.4.0.2 + dan kesalahan khusus ini mungkin hilang (memberi Anda mengkonfigurasi file_path Anda dengan benar seperti yang lain).


Memberi konteks: Saya beralih ke penargetan Oreo dari Nougat di aplikasi Xamarin.Forms dan mengambil gambar dengan Xam.Plugin.Media mulai gagal dengan pesan kesalahan di atas, jadi memperbarui paket-paket melakukan trik untuk saya ok.


0

Saya perhatikan bahwa kebijakan atau perilaku tentang path.xmlfile berubah antara Perpustakaan Dukungan 26 dan 27. Untuk mengambil gambar dari kamera, saya melihat perubahan berikut:

  • Dengan 26, saya harus menggunakan <external-path>dan path lengkap yang diberikan dalam pathargumen.

  • Dengan 27, saya harus menggunakan <external-files-path>dan hanya subfolder dalam pathargumen.

Jadi apa yang secara khusus bekerja untuk saya dengan Support Library 27 sebagai path.xmlfile itu

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="camera_image" path="Pictures/"/>
</paths>

0

Halo Teman, Coba Ini

Dalam Kode ini

1) Cara Mendeklarasikan 2 Penyedia File di Manifest.

2) Penyedia Pertama untuk Unduhan file

3) Penyedia kedua digunakan untuk kamera dan galeri

LANGKAH 1

     <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

Provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="apks" path="." />
</paths>

Penyedia kedua

     <provider
        android:name=".Utils.MyFileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities"
        tools:ignore="InnerclassSeparator">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_path" />
    </provider>

file_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="storage/emulated/0" path="."/>
</paths>

.Utils.MyFileProvider

Buat Kelas MyFileProvider (hanya Buat kelas tanpa metode apa pun mendeklarasikan)

Ketika Anda menggunakan Penyedia File digunakan (.fileprovider) nama ini dan Anda digunakan untuk gambar (.penyedia) menggunakan ini.

JIKA ada masalah untuk memahami kode ini, Anda dapat Menghubungi di rp1741995@gmail.com saya akan membantu Anda.


0

Masalahnya mungkin bukan hanya path xml.

Berikut ini adalah perbaikan saya:

Melihat ke kursus root di android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile():

    public File getFileForUri(Uri uri) {
        String path = uri.getEncodedPath();

        final int splitIndex = path.indexOf('/', 1);
        final String tag = Uri.decode(path.substring(1, splitIndex));
        path = Uri.decode(path.substring(splitIndex + 1));

        final File root = mRoots.get(tag); // mRoots is parsed from path xml
        if (root == null) {
            throw new IllegalArgumentException("Unable to find configured root for " + uri);
        }

        // ...
    }

Ini berarti mRootsharus mengandung tag uri yang diminta. Jadi saya menulis beberapa kode untuk dicetak mRootsdan tag uri, dan kemudian dengan mudah menemukan tag tidak cocok .

Muncul bahwa pengaturan otoritas penyedia seperti ${applicationID}.provideride bodoh ! Wewenang ini sangat umum yang dapat digunakan oleh penyedia lain, yang akan mengacaukan konfigurasi jalan!


-1

Anda perlu mengubah file xml file_paths.xml dari

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

untuk

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <fexeternal-path name="my_images" path="Android/data/com.example.marek.myapplication/files/Pictures"/>
</paths>

1
Meskipun Anda telah menyalin jawaban Anda dari atas, itu tidak dilakukan dengan benar. Harap perbaiki ketidakcocokan pengetikan dalam jawaban Anda.
Abhinav Saxena
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.