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.
android
android-fileprovider
Pivoman
sumber
sumber
Jawaban:
File Anda disimpan di bawah
getExternalFilesDir()
. Itu peta untuk<external-files-path>
, bukan<files-path>
. Juga, jalur file Anda tidak mengandungimages/
di dalamnya, sehinggapath
atribut di XML Anda tidak valid.Ganti
res/xml/file_paths.xml
dengan: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
sumber
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
Inilahpath="."
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 adalahContextCompat#getExternalFilesDirs
mengembalikan null @ line 616 (v26.0.1), jadi PathStrategy tidak terdaftar. Ini terjadi pada perangkat Huawei.Ini dapat menyelesaikan masalah semua orang: Semua tag ditambahkan sehingga Anda tidak perlu khawatir tentang jalur folder. Ganti res / xml / file_paths.xml dengan:
sumber
Mendapat masalah serupa setelah mengaktifkan rasa (dev, stage).
Sebelum mencicipi sumber daya jalur saya tampak seperti ini:
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.
sumber
Jika Anda menggunakan cache internal maka gunakan.
sumber
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
2 - Jika Anda mencoba banyak jalan tanpa hasil, maka uji dengan ini:
Uji ini, jika kamera berfungsi, maka mulailah menghilangkan beberapa garis dan melanjutkan pengujian ...
3 - Jangan lupa verifikasi apakah kamera diaktifkan di emulator Anda.
sumber
Saya yakin saya terlambat ke pesta tetapi di bawah ini bekerja untuk saya.
sumber
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.
Saya hanya mengubah 'jalur' ini menjadi jalur penuh dan hanya berfungsi.
sumber
Saya akan terlambat tetapi saya menemukan solusi untuk itu. Bekerja dengan baik untuk saya, saya baru saja mengubah jalur file XML ke:
sumber
provider_paths.xml
memberikan peringatan inspeksi "Elemen root-path tidak diperbolehkan di sini".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.
Lihat lebih detail di sini FileProvider dan penyimpanan eksternal sekunder
sumber
Periksa berapa banyak penyimpanan yang ditawarkan perangkat Anda - berbagi file dari penyimpanan sekunder tidak didukung. Lihat
FileProvider.java
sumber (dari support-core-utils 25.3.1 ):Jadi, mereka hanya mengambil penyimpanan pertama.
Anda juga dapat melihat yang
getExternalCacheDirs()
digunakan untuk mendapatkan daftar penyimpanan melaluiContextCompat
antarmuka. 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 dilewatigetUriForFile()
.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.
sumber
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-path
sub direktori akanContext.getFilesDir()
. Yang funky adalah iaContext.getFilesDir()
mencatat satu subdirektori lainnya.apa yang saya cari adalah
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
kembali
/data/user/0/com.psh.mTest/files
jadi tag seharusnya
....
files-path name="app_imageDir" path="../app_imageDir/" ......
Lalu berhasil !!
sumber
getExternalStorageDirectory()
dan saya seharusnya memberi path dengan<external-path>
tag alih-alih<files-path>
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:
Di sini juga memiliki tutorial yang sangat baik tentang pertanyaan ini: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
sumber
Masalah saya adalah bahwa saya memiliki nama yang tumpang tindih di jalur file untuk berbagai jenis, seperti ini:
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.
sumber
Apa yang saya lakukan untuk menyelesaikan ini -
AndroidManifest.xml
filepaths.xml (Mengizinkan FileProvider untuk membagikan semua file yang ada di dalam direktori file eksternal aplikasi)
dan di kelas java -
sumber
Ini bekerja untuk saya juga. Alih-alih memberikan path lengkap saya memberikan path = "Gambar" dan itu bekerja dengan baik.
sumber
Tergantung jenis penyimpanan yang ingin Anda lakukan, INTERNAL atau EKSTERNAL
untuk PENYIMPANAN EKSTERNAL
tetapi untuk PENYIMPANAN INTERNAL, hati-hati dengan path, karena menggunakan metode getFilesDir () yang berarti bahwa file Anda akan berada di direktori root untuk aplikasi ("/")
Jadi file penyedia Anda harus seperti ini:
sumber
tidak ada yang di atas bekerja untuk saya, setelah beberapa jam men-debug saya mengetahui bahwa masalahnya ada di
createImageFile()
, khususnyaabsolute path
vsrelative path
Saya berasumsi bahwa kalian menggunakan panduan Android resmi untuk mengambil foto. https://developer.android.com/training/camera/photobasics
Perhatikan
storageDir
, ini adalah lokasi di mana file akan dibuat. Jadi untuk mendapatkan path absolut dari file ini, saya cukup menggunakanimage.getAbsolutePath()
, path ini akan digunakanonActivityResult
jika Anda membutuhkan gambar Bitmap setelah mengambil fotodi bawah ini adalah
file_path.xml
, cukup gunakan.
sehingga menggunakan jalur absolutdan jika Anda memerlukan bitmap setelah mengambil foto
sumber
Saya mendapatkan kesalahan ini
Failed to find configured root that contains...
Pekerjaan berikut ini menyelesaikan masalah saya
res / xml / file_paths.xml
AndroidManifest.xml
ActivityClass.java
sumber
Dokumen resmi Android mengatakan file_paths.xml seharusnya memiliki:
sumber
Perubahan berikut dalam file xml file_paths bekerja untuk saya.
sumber
1.Buat Xmlfile: provider_paths
2. File mainfest
3. Dalam file Java Anda.
sumber
Jika tidak ada yang membantu dan Anda mendapatkan kesalahan
lalu coba ubah beberapa baris seperti:
untuk:
dan dalam file xml:
yang aneh, karena folder yang saya akses adalah
/images
.sumber
Masalah Saya Salah Nama File : Saya Buat di
file_paths.xml
bawah res / xml sementara sumber daya ditetapkanprovider_paths.xml
di Manifest:Saya berubah
provider_paths
menjadifile_paths
dan memecahkan masalah.sumber
Jika path file Anda seperti / storage / emulated / 0 / "file Anda"
Anda hanya perlu memodifikasi FileProvider xml Anda
lalu panggil fungsi ini saat Anda perlu berbagi file
ini bekerja di Android M ~ Pie
sumber
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 manifespath
atribut dalam file_paths.xmlauthority
argumen saat memanggil FileProvider.getUriForFile ().sumber
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).
sumber
Saya perhatikan bahwa kebijakan atau perilaku tentang
path.xml
file 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 dalampath
argumen.Dengan 27, saya harus menggunakan
<external-files-path>
dan hanya subfolder dalampath
argumen.Jadi apa yang secara khusus bekerja untuk saya dengan Support Library 27 sebagai
path.xml
file itusumber
Halo Teman, Coba 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_paths.xml
Penyedia kedua
file_path.xml
.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 [email protected] saya akan membantu Anda.
sumber
Masalahnya mungkin bukan hanya path xml.
Berikut ini adalah perbaikan saya:
Melihat ke kursus root di
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Ini berarti
mRoots
harus mengandung tag uri yang diminta. Jadi saya menulis beberapa kode untuk dicetakmRoots
dan tag uri, dan kemudian dengan mudah menemukan tag tidak cocok .Muncul bahwa pengaturan otoritas penyedia seperti
${applicationID}.provider
ide bodoh ! Wewenang ini sangat umum yang dapat digunakan oleh penyedia lain, yang akan mengacaukan konfigurasi jalan!sumber
Anda perlu mengubah file xml file_paths.xml dari
untuk
sumber