FileProvider - IllegalArgumentException: Yapılandırılmış ildiz topilmadi

Men kamera bilan suratga olishga harakat qilyapman, lekin quyidagi xatoni oldim:

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:


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

Java:

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

    

Men bu xato haqida butun kunni qidiryapman va FileProvider ni tushunishga harakat qilardim, ammo bu xato xabari menga qanday xabar berishni bilmayman. Agar ko'proq ma'lumot/kod so'rashni istasangiz, menga izoh yozing.

63
Xuddi shu masalaga Ran. Ushbu yechimni eng kichik github misol loyihasini ishlatib, asosiy FileProvider sozlamalarini olish uchun topildi: stackoverflow.com/a/48103567/2162226 . Mahalliy mustaqil loyihaga fayllarni (o'zgartirmasdan) nusxa ko'chirish uchun qadamlar qo'yiladi
qo'shib qo'ydi muallif gnB, manba
CreateImageFile usul kodini ham joylashtirasizmi?
qo'shib qo'ydi muallif Ankit Batra, manba
Men juda afsusdaman, lekin Ushbu loyihani bekor qildim va endi u ustida ishlamayman . Bu savolni "yopish" uchun eng sevimli javobni qabul qilaman. Barcha ishtirokchilar uchun rahmat va men boshqalarga yordam berishiga umid qilaman.
qo'shib qo'ydi muallif Pivoman, manba

22 javoblar

Your file is stored under getExternalFilesDir(). That maps to , not . Also, your file path does not contain images/ in it, so the path attribute in your xml is invalid.

res/xml/file_paths.xml manzilini o'zgartiring:

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

    

58
qo'shib qo'ydi
Men bir xil voqea (50-100 qurilmadan tashqari) haqida xabar oldim. android = "http://schemas.android.com/apk/res/android"> /code> path = "." - mening o'z tadqiqotimda eng yuqori darajada qolish uchun topilgan narsadir. Agar FileProvider orqali yaqindan tanishsangiz, XML'dan o'qiladigan yo'l kanonizatsiyalangan bo'ladi. Eng yaxshi taxminimcha, ContextCompat # getExternalFilesDirs null @line 616 (v26.0.1) ni qaytarib berdi, shuning uchun PathStrategy ro'yxatdan o'tkazilmagan. Bu Huawei qurilmasida yuz berdi.
qo'shib qo'ydi muallif user3175580, manba
@Pivoman: Agar siz xuddi shu xatolikni ("umumiy ildizni topib bo'lmadi" deb topilsa) ... men sizning fikringizdan kelib chiqadigan yagona tushuntirish Android qo'llab-quvvatlash kutubxonalarining eski versiyasidan foydalanayotganligingizdir. Siz joriy versiyadan foydalanayotganingizga ishonch hosil qiling (m-n, 25.2.0 ). Aks holda, nima deyishni bilmayman.
qo'shib qo'ydi muallif CommonsWare, manba
@Pivoman: So'ngra semptomlaringizni tushuntirib berolmayman, afsus.
qo'shib qo'ydi muallif CommonsWare, manba
"" Yo'l "xususiyati aniqlanishi kerak" biz bu erda konfiguratsiyani yo'qotamiz.
qo'shib qo'ydi muallif blackjack, manba
Men Android 5da bir nechta yo'l bilan muammo chiqarmoqdaman. Ikkinchisida faqat bitta yo'l qoldi.
qo'shib qo'ydi muallif ODAXY, manba
qo'shib qo'ydi muallif Safeer, manba
Barcha kutubxonalarning yangi versiyalari bor.
qo'shib qo'ydi muallif Pivoman, manba
OK, men tashqi fayllar yo'lini qo'shdim, lekin hali ham bir xil xato bor:/Balki boshqa xatolar bor. Emulator android qurilmasidan foydalanayapman, u papkani yoki biror narsani yaratishim kerakmi?
qo'shib qo'ydi muallif Pivoman, manba

Faollashtirilgan lazzatlardan so'ng (dev, sahna) o'xshash muammoga duch keldingiz.

Tatlardan oldin mening manba manbaiga mana bunday edi:

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

    

Android qo'shilganidan keyin: authorities = "$ {applicationId} .fileprovider" Manifest appId da pl.myapp.dev yoki pl.myapp.stage lazzatlanishiga bog'liq va ilova shikastlanishni boshladi. To'liq yo'lni olib tashladim va nuqta bilan almashtirdim va har bir narsa ishlay boshladi.

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

    

31
qo'shib qo'ydi
Men uchun ishladi. Rahmat! Qanday qilib ". belgisi?
qo'shib qo'ydi muallif NightFury, manba
Ushbu yechimning salbiy oqibatlari bormi?
qo'shib qo'ydi muallif RediOne1, manba
@antygravity, iltimos, bu yechim ma'lumotlarini/hujjatlarini taqdim eta olasizmi?
qo'shib qo'ydi muallif geekoraul, manba
Men nima uchun bunday emasligini bilmayman, lekin bu yechim men uchun ishlaydi.
qo'shib qo'ydi muallif Vishal G. Gohel, manba

Ichki keshni ishlatgan holda foydalaning.


    

25
qo'shib qo'ydi
mening vaqtimni ko'p qutqarding
qo'shib qo'ydi muallif prasanthMurugan, manba
Spot qiling. Rahmat.
qo'shib qo'ydi muallif Joshua Pinter, manba
Rahmat, mening holatim: menda/data/data/pkg_name/files-da saqlangan ilova o'rnatilishini xohlayman, shuning uchun to'g'ri tarzda sozlash:
qo'shib qo'ydi muallif Alpha OF, manba
Bu ishlagan, rahmat!
qo'shib qo'ydi muallif Jonez, manba

Qurilmangizning qancha saqlash joyi borligini tekshiring - ikkilamchi xotiradan fayllarni ulash qo'llab-quvvatlanmaydi. FileProvider.java manbasiga qarang ( support-core-utils 25.3.1 dan):

            } 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];
                }
            }

Shunday qilib, ular faqat birinchi xotira oladi.

Bundan tashqari, getExternalCacheDirs() ContextCompat interfeysi orqali saqlash ro'yxatini olish uchun ishlatilishini ko'rishingiz mumkin. Uning cheklovlari uchun hujjatlarni ko'ring. Masalan, USB yonib-o'chadi. Eng yaxshisi, bu APIdan o'zingizning saqlanadigan ro'yxatlaringizning ba'zi disk raskadroviy mahsulotlarini o'zingiz yaratmoqchi bo'lsangiz, saqlash uchun ushbu yo'lni getUriForFile() ga uzatilgan yo'lga mosligini tekshirishingiz mumkin.

Google'ning muammolarni izdoshi sifatida oldindan " chipta atalgan (06-2017 gacha), ko'proq qo'llab-quvvatlashni so'rash bir saqlashdan ko'ra ko'proq. Oxir-oqibat, ushbu savolga javobni topdim.

11
qo'shib qo'ydi
Bu chuqurroq javob ko'proq ko'tarilishga to'g'ri keladi. FileProvider tashqi xotirasi aslida qanday tan olishi uchun tashakkur.
qo'shib qo'ydi muallif LarsH, manba

Bu meni bir oz chalkashtirib yubordi.

Muammo xml faylida "yo'l" xususiyati.

Ushbu hujjatdan FileProvider "Yo'l" - bu kichik katalog, lekin boshqa hujjatda (kamera/fotobazika) ko'rsatiladi "Yo'l" to'liq yo'l.

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

    

Men bu "yo'l" ni to'liq yo'l bilan o'zgartiraman va u faqat ishlaydi.

11
qo'shib qo'ydi
Bu API 16da ishlamaydi
qo'shib qo'ydi muallif Sunil, manba

Bularning hech biri men uchun ishlamagan. Ishlayotgan yagona yondashuv xml-da ochiq yo'lni e'lon qilish emas. Buni qiling va baxtli bo'ling:

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

    

Here too has a excelent tutorial about this question: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s

4
qo'shib qo'ydi

buni sinab ko'ring

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

    

4
qo'shib qo'ydi
yo'l bo'sh bo'lmaydi
qo'shib qo'ydi muallif Michael Peterson, manba
StackOverflow-ga xush kelibsiz! Javobingizning sifatini tushuntirishni qo'shish orqali yaxshilashingiz mumkin ("Ushbu kodni sinab ko'ring, chunki ..."). Bu boshqalarga kodingizni ishlatish uchun nima uchun ni tushunishlariga yordam beradi.
qo'shib qo'ydi muallif Nander Speerstra, manba
O'ylaymanki, unga ovoz berish kerak emas, u SO da yangi! Bu tushkunlik, uni SO dan foydalanishga to'sqinlik qilmoqda! Biz unga izoh berishimiz va unga qanday yordam berishlarini bildirishimiz mumkin! Atleast birovga yordam berishga harakat qildi, u barcha ma'lumotlarni yozmadi, chunki u platformada yangi edi!
qo'shib qo'ydi muallif Nirmal Subedi, manba

Buni hal qilish uchun nima qildim -

AndroidManifest.xml


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

filepaths.xml (FileProvider ilovaning tashqi fayllar katalogidagi barcha fayllarni bo'lishishga ruxsat berish)

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

    

va java sinfida -

Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);
2
qo'shib qo'ydi

Men kechikib qolaman, lekin men uni hal qilish uchun yechim topdim. Men uchun yaxshi ish, faqat xml faylini quyidagicha o'zgartirdim:

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

    

2
qo'shib qo'ydi
men uchun bir tonna rahmat! :)
qo'shib qo'ydi muallif Kam wave, manba

Bu men uchun ham ishladi. To'liq yo'lni berish o'rniga "yo'l" = yo'l berdi va u yaxshi ishladi.

<?xml version="1.0" encoding="utf-8"?>
 
  
  
 
2
qo'shib qo'ydi

Surat mashinasini ishga tushirish va fotosuratni saqlash uchun Android 6 va 7 ni ishlayapman.

Menda ishlaydigan 100% ish haqining yechimi quyidagicha:

AndroidManifest.xml

  
    
    
    
    
    
    
    
    
    

    
    

    
    
    
    
    
    
    
    
    
    
    
    
    

....

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

file_paths qaerda? xml faylini res/xml papkasida yaratish kerak.

file_paths.xml

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

    

MainActivity.class

private void SavePhoto(String fileName,  ContentValues values)
{
  //If the parent dir doesn't exist, create it
   File folder = new File(Environment.getExternalStorageDirectory(),  "Pictures");
   boolean success = true;
   if (!folder.exists()) {
       success = folder.mkdir();
   }
   if (success) {
     //Do something on success
   } else {
    //Do something else on failure
  }

  File file = new File(folder, fileName);
  imageUri = FileProvider.getUriForFile(context, "com.example.android.fileprovider", file);

  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
  intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
  }
}
1
qo'shib qo'ydi
@Shadow to'g'ri. Uning koptozi, Sizga kerak bo'lgan narsalaringizni ishlatishingiz kerak.
qo'shib qo'ydi muallif Academy of Programmer, manba
Nima uchun bunday ruxsatnomalar ko'p?
qo'shib qo'ydi muallif Shadow, manba

none of the above worked for me, after a few hours debugging I found out that the problem is in createImageFile(), specifically absolute path vs relative path

I assume that you guys are using the official Android guide for taking photo. 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 ga e'tibor bering, bu fayl yaratiladigan joy. Shunday qilib, ushbu faylning mutlaq yo'lini olish uchun image.getAbsolutePath() kodini ishlatishingiz mumkin, agar u sizdan keyin Bitmap tasvirni talab qiladigan bo'lsa onActivityResult rasm

Quyida file_path.xml , . dan foydalaning, shunda mutlaq yo'lni ishlatadi


    

va siz rasmga tushganingizdan keyin bitmap kerak bo'lsa

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();
        }
    }
1
qo'shib qo'ydi

Xuddi shu muammoga duch keldim, uning ishlashi uchun quyidagi kodni sinab ko'rdim.

1. Xmlfile tuzing: provider_paths

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

    

2. Mainfest fayli

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

3. Java faylida.

      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
qo'shib qo'ydi

I finally find my problem. I described it in the this link.

Mening muammom nizomni tuzatishda va tarqatish rejimida dastur kimligi o'rtasidagi farq edi

0
qo'shib qo'ydi

XML file_paths faylida quyidagi o'zgarishlar men uchun ishlagan.

 
 
0
qo'shib qo'ydi

Menimcha, hech bo'lmaganda file_paths.xml da boshqalar bilan bir xil yo'lni ta'minlay olmaysiz. Shuning uchun, iltimos, quyidagi 3 ta joyda bir xil to'plam nomini yoki yo'lini aniq ishonch hosil qiling:

  • android:authorities attribute in manifest
  • path attribute in file_paths.xml
  • authority argument when calling FileProvider.getUriForFile().
0
qo'shib qo'ydi
  • Xamarin.Android foydalanuvchilar uchun

Bundan tashqari, Android 7.1, 8.0+ ni qo'llab-quvvatlashda qo'llab-quvvatlash paketlaringizni yangilab bo'lmaydi. Ularni v25.4.0.2 + sahifasiga yangilang. > va ushbu muammoni echishingiz mumkin (sizning file_path faylingizni boshqalar ko'rsatganidek, sizni to'g'ri konfiguratsiya qilyapsiz).


Kontekst berilishi: Nougat dan Oreo ga o'tishga harakat qildim    Xamarin.Forms ilovasidan foydalaning va Xam.Plugin.Media   yuqoridagi xato xabari bilan ishlamay boshladi, shuning uchun paketlarni yangilash   men uchun yaxshi hiyla qildi.

0
qo'shib qo'ydi

Android rasmiy hujjati file_paths.xml-da bo'lishi kerak:

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

Lekin so'nggi androidda ishlash uchun u erda yo'lning oxirida "/" bo'lishi kerak:

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

0
qo'shib qo'ydi

Salom do'stlar buni sinab

Ushbu kodda

1) Manifestda 2-fayl provayderini qanday qilib e'lon qilish kerak?

2) Faylni yuklab olish uchun birinchi Provayder

3) ikkinchi Provayder kamera va gallar uchun ishlatiladi

1-qadam

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

Provider_paths.xml

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



Ikkinchi provayder

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

file_path.xml

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



.Utils.MyFileProvider

Sinf yaratish MyFileProvider (faqat sinf yaratish hech qanday usul e'lon)

Siz ishlatgan Faylni Provayderi (.fileprovider) dan foydalanganda va siz tasvir uchun ishlatilgan (.provider) bu ishlatilgan.

Ushbu kodni tushunish uchun biron bir muammo bo'lsa, sizga yordam beradigan [email protected] bilan bog'lanishingiz mumkin.

0
qo'shib qo'ydi

path.xml fayliga tegishli siyosat yoki xatti-harakatlar qo'llab-quvvatlash kutubxonasi 26 va 27 o'rtasida o'zgartirildi. Kameradan rasm olish uchun quyidagi o'zgarishlarni ko'rdim:

  • With 26, I had to use and the full path given in the path argument.

  • With 27, I had to use and only the subfolder in the path argument.

Shunday qilib, path.xml faylini qo'llab-quvvatlaydigan Yordam Kutubxonasi 27 uchun men uchun maxsus ishlagan

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

    

0
qo'shib qo'ydi

Qaysi saqlash turini amalga oshirishni istasangiz, INTERNAL yoki EXTERNAL

tashqi saqlash uchun

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

    

ammo ichki saqlash uchun, yo'l bilan ehtiyot bo'ling, chunki u getFilesDir() usulidan foydalanadi bu sizning faylingiz ilova ildiz katalogida joylashganligini anglatadi ("/")

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

Shunday qilib, provayderingiz faylida shunday bo'lishi kerak:


    

0
qo'shib qo'ydi

Tashqi xotira sizning ikkinchi xotirangizga ishora qilmasligini bilib oling, aka "olinadigan xotira" ("tashqi" nomiga qaramasdan). Agar "Konfiguratsiya qilingan ildizni topib bo'lmadi" ni tanlasangiz, siz ushbu satrni xml faylingizga qo'shishingiz mumkin.


See more details here FileProvider and secondary external storage

0
qo'shib qo'ydi