FileProvider - IllegalArgumentException: कॉन्फ़िगर रूट खोजने में विफल


233

मैं कैमरे के साथ एक तस्वीर लेने की कोशिश कर रहा हूं, लेकिन मुझे निम्नलिखित त्रुटि मिल रही है:

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, लेकिन मुझे नहीं पता कि यह त्रुटि संदेश मुझे बताने की कोशिश करता है। यदि आप अधिक जानकारी / कोड चाहते हैं, तो मुझे टिप्पणी में लिखें।


2
क्या आप createImageFile विधि कोड भी पेस्ट कर सकते हैं?
अंकित बत्रा

मुझे बहुत खेद है, लेकिन मैंने इस परियोजना को रद्द कर दिया है और मैं इस पर काम नहीं कर रहा हूं । मैं इस प्रश्न को "बंद" करने के लिए सबसे पसंदीदा उत्तर स्वीकार करूंगा। भागीदारी के लिए सभी का धन्यवाद और मुझे उम्मीद है कि यह दूसरों की मदद करेगा।
पिवोमन

उसी मुद्दे में भाग गया। एक मूल फ़ाइलप्रॉइडर सेटअप प्राप्त करने के लिए इस समाधान को मिला एक न्यूनतम गिटब उदाहरण परियोजना का उपयोग करके जा रहा है: stackoverflow.com/a/48103567/2162226 । यह उन कदमों को प्रदान करता है जिनके लिए स्थानीय स्टैंडअलोन परियोजना में फ़ाइलों को (बिना परिवर्तन किए) कॉपी करना है
जीन बो

यह मुद्दा अब डेल्फी 10.4 में तय किया गया है: quality.embarcadero.com/browse/RSP-26950
डेव नट

जवाबों:


209

आपकी फ़ाइल के नीचे संग्रहीत है getExternalFilesDir()। वह नक्शे <external-files-path>, नहीं <files-path>। साथ ही, आपका फ़ाइल पथ इसमें शामिल नहीं है images/, इसलिए pathआपके XML में विशेषता अमान्य है।

इसके res/xml/file_paths.xmlसाथ बदलें :

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

अद्यतन 2020 मार्च 13

अनुवर्ती के रूप में एक विशिष्ट पथ के लिए प्रदाता पथ:

  • <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
ठीक है, मैंने बाह्य-फ़ाइलें-पथ को जोड़ा, लेकिन मेरे पास अभी भी वही त्रुटि है: / शायद अधिक बग हैं। मैं एमुलेटर एंड्रॉइड डिवाइस का उपयोग कर रहा हूं, क्या मुझे वह फ़ोल्डर या कुछ और बनाना है?
पिवोमन

22
"पथ 'विशेषता को परिभाषित किया जाना चाहिए" हम कॉन्फ़िगरेशन में यहां पथ को याद कर रहे हैं।
लाठी

1
मुझे एंड्रॉइड पर कई रास्तों की समस्या हो रही थी। 2. 2 के बजाय केवल एक ही रास्ता छोड़ा।
ODAXY

3
मुझे एक क्रैश रिपोर्ट मिली (50-100 उपकरणों में से, मुझे लगता है) जो इसके समान है। क्या मैं अपने खुद के अनुसंधान में पाया शीर्ष स्तर पर रहने के लिए है। यदि आप फ़ाइलप्रॉइडर के माध्यम से अधिक बारीकी से जाते हैं, तो आप देखेंगे कि एक्सएमएल से पढ़ा गया मार्ग कैनोनिकलकृत हो जाता है। मेरा सबसे अच्छा अनुमान है कि null @line 616 (v26.0.1) लौटा, इसलिए एक PathStrategy पंजीकृत नहीं थी। हुआवेई डिवाइस पर यह हुआ। <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>path="."ContextCompat#getExternalFilesDirs
Androidguy

10
उपयोग करने के बजाय <बाहरी-फ़ाइलें-पथ मैंने कोशिश की <बाहरी-पथ और यह काम किया।
Safeer

166

इससे हर समस्या का समाधान हो सकता है: सभी टैग जोड़े जाते हैं, इसलिए आपको फ़ोल्डर पथ के बारे में चिंता करने की आवश्यकता नहीं है। बदलें res / xml / file_paths.xml के साथ:

<?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
सबसे अच्छा उपाय। धन्यवाद।
पवन पिल्लई

1
सरल समाधान ... लेकिन इस शानदार के लिए! मैंने एक प्रदाता का उपयोग किया फिर मैंने गंतव्य निर्देशिका को बदलने के लिए उपयोगकर्ता संभावना में प्रवेश किया ... कुछ भी काम नहीं किया क्योंकि उस समय प्रदाता गतिशील होना चाहिए .... आपने हर दिन बचाया!
ब्रोंज

1
इस समाधान का उपयोग किया और कोड काम करना शुरू कर दिया। परीक्षण में से अनावश्यक कोड को हटा दिया गया, जो इनमें से एक था
कार्तिक

1
भाई तुमने मेरा दिन बचाया। बहुत बहुत धन्यवाद :-)
मंजूनाथ कल्लनवर

1
महान ने मेरे लिए काम किया, एक नए शिक्षार्थी के रूप में मुझे यह एहसास हुआ कि मुझे बाहरी फ़ाइलों से नहीं बल्कि कैश से मिल रहा है
टोनी मेरिट

82

सक्षम जायके (देव, मंच) के बाद समान समस्या मिली।

जायके से पहले मेरा पथ संसाधन इस तरह दिखता था:

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

Android के बाद: अधिकारियों = "$ {applicationId} .fileprovider" मेनिफेस्ट appId में pl.myapp.dev या pl.myapp.stage स्वाद पर निर्भर करता है और ऐप क्रैश होने लगा। मैंने पूरा रास्ता निकाल दिया और इसे डॉट के साथ बदल दिया और सब कुछ काम करना शुरू कर दिया।

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

7
मेरे लिए काम किया। धन्यवाद! आप कैसे साथ आए '।' संकेतन?
नाइटफेयर

2
@antygravity क्या आप इस समाधान का संदर्भ / प्रलेखन प्रदान कर सकते हैं?
गेकोराउल

7
क्या इस समाधान के कोई नकारात्मक परिणाम हैं?
RediOne1

मेरे लिए काम किया, बहुत बहुत धन्यवाद।
हिरेन

यह स्वीकृत उत्तर होना चाहिए! एकमात्र समाधान जो काम किया
egorikem

43

यदि आप आंतरिक कैश का उपयोग कर रहे हैं तो उपयोग करें।

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

3
धन्यवाद, मेरी स्थिति: मैं एक ऐप इंस्टॉल करना चाहता हूं, जो / डेटा / डेटा / pkg_name / फ़ाइलों में सहेजा गया है, इसलिए मेरा सही कॉन्फ़िगर निम्नानुसार है: <files-path name = "files" path = "/" />
aolphn

25

कुछ हफ़्ते खोजने की कोशिश में 2 हफ़्ते खो गए ... यदि आप ऊपर के कुछ भी प्रयास करने के बाद यहां पहुंचे:

1 - सत्यापित करें कि क्या आपका टैग प्रदाता टैग एप्लिकेशन के अंदर है

<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 - यदि आप सफलता के बिना बहुत सारे रास्ते आजमाते हैं, तो इस बात का परीक्षण करें:

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

यह परीक्षण करें, यदि कैमरा काम करता है, तो कुछ लाइनों को समाप्त करना शुरू करें और परीक्षण जारी रखें ...

3 - यदि आपके एमुलेटर में कैमरा सक्रिय है, तो कोई भी सत्यापन सत्यापित न करें।


1
धन्यवाद, यह मेरे लिए काम किया। क्या अन्य रास्तों को हटाना आवश्यक है?
कोडस्लेव

22

मुझे यकीन है कि मुझे पार्टी के लिए देर हो रही है लेकिन नीचे मेरे लिए काम किया है।

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

यह मेरे कोड के रूप में अच्छी तरह से काम करने के लिए अंतिम चरण था! धन्यवाद।
डॉग डॉगमा

15

यह मुझे थोड़ा भ्रमित भी करता है।

समस्या आपकी xml फ़ाइल में "पथ" विशेषता पर है।

इस दस्तावेज़ से FileProvider 'पथ' एक उपनिर्देशिका है, लेकिन एक अन्य दस्तावेज़ में (कैमरा / फोटोबासिक्स) दिखाया गया है 'पथ' पूर्ण पथ है।

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

मैं सिर्फ इस 'पथ' को पूर्ण पथ में बदलता हूं और यह सिर्फ काम करता है।


15

मुझे देर हो जाएगी, लेकिन मुझे इसके लिए एक समाधान मिला। मेरे लिए ठीक होने पर, मैंने बस XML फ़ाइल के पथ को बदल दिया:

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

1
मेरे लिए यह provider_paths.xmlएक निरीक्षण चेतावनी देता है "तत्व जड़-पथ यहाँ अनुमति नहीं है"।
लुइस ए। फ्लोरिट

15

विदित हो कि बाहरी-पथ आपके द्वितीयक भंडारण, उर्फ ​​"हटाने योग्य भंडारण" ("बाहरी" नाम के बावजूद) की ओर इशारा नहीं करता है। यदि आपको "कॉन्फ़िगर रूट को खोजने में विफल" हो रहा है, तो आप इस लाइन को अपनी XML फ़ाइल में जोड़ सकते हैं।

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

अधिक जानकारी यहाँ देखें FileProvider और माध्यमिक बाहरी भंडारण


14

जांचें कि आपका डिवाइस कितने स्टोरेज प्रदान करता है - सेकेंडरी स्टोरेज से फाइल शेयर करना समर्थित नहीं है। को देखो FileProvider.javaस्रोत (से समर्थन कोर-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];
                }
            }

इसलिए, वे केवल पहला स्टोरेज लेते हैं।

इसके अलावा, आप देख सकते हैं कि इंटरफ़ेस के getExternalCacheDirs()माध्यम से स्टोरेज की सूची प्राप्त करने के लिए उपयोग किया जाता है ContextCompat। इसकी सीमाओं के लिए प्रलेखन देखें (यह उदाहरण के लिए USB फ्लैश को नहीं पहचानने के लिए कहा गया है)। इस API से स्टोरेज की सूची का कुछ डिबग आउटपुट अपने आप बनाना सबसे अच्छा है, ताकि आप उस पथ को स्टोर करने के लिए जाँच कर सकेंgetUriForFile()

Google के इश्यू ट्रैकर में पहले से ही एक टिकट दिया गया है (06-2017 तक), एक से अधिक स्टोरेज को सपोर्ट करने के लिए। आखिरकार, मुझे इस पर भी SO प्रश्न मिला ।


1
यह गहराई से उत्तर अधिक उत्थान हो रहा है। बाहरी संग्रहण FileProvider वास्तव में क्या पहचानता है, यह जानने के लिए धन्यवाद।
लार्स ऑक्ट

10

मैंने इसके लिए 5 घंटे बिताए हैं।

मैंने ऊपर दिए गए सभी तरीकों की कोशिश की है, लेकिन यह इस बात पर निर्भर करता है कि वर्तमान में आपका ऐप किस स्टोरेज का उपयोग कर रहा है।

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

कोड्स को आज़माने से पहले दस्तावेज़ीकरण की जाँच करें।

files-pathउप निर्देशिका के बाद से मेरे मामले में Context.getFilesDir()। मज़ेदार बात हैContext.getFilesDir() एक दूसरे के उपनिर्देशिका नोट करता है।

मैं जो देख रहा हूं वह है

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

Context.getFilesDir()

रिटर्न /data/user/0/com.psh.mTest/files

इसलिए टैग होना चाहिए

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

तब यह काम करता है !!


1
प्रलेखन का जिक्र करने के लिए धन्यवाद। इसने मुझे सही उत्तर तक पहुँचाया। मेरे मामले में मेरी फ़ाइल के साथ सहेजा गया था getExternalStorageDirectory()और मुझे <external-path>इसके बजाय टैग के साथ पथ प्रदान करना चाहिए था<files-path>
alierdogan7

फ़ाइलों-पथ पर इस विशिष्ट उत्तर के लिए धन्यवाद। इससे बहुत मदद मिली। :)
arungiri_10

हाँ यह काम करता है!!! मुख्य बिंदु पथ की शुरुआत में ".." को निर्दिष्ट करना है, जैसे कि पथ = "../ myDirectory /"
रॉबर्ट Apikyan

9

इसमें से किसी ने भी मेरे लिए काम नहीं किया। एकमात्र तरीका जो काम करता है वह एक्सएमएल में एक स्पष्ट मार्ग घोषित नहीं करना है। तो ऐसा करो और खुश रहो:

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

यहाँ भी इस प्रश्न के बारे में एक उत्कृष्ट ट्यूटोरियल है: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s


7

मेरा मुद्दा यह था कि मेरे पास विभिन्न प्रकारों के लिए फ़ाइल पथों में ओवरलैपिंग नाम थे, जैसे:

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

चूँकि मैंने नामों ("कैश्ड_फाइल्स") को अद्वितीय होने के लिए बदल दिया, इसलिए मुझे त्रुटि से छुटकारा मिल गया। मेरा अनुमान है कि उन रास्तों को कुछ हाशप या किसी ऐसी चीज़ में रखा जाता है जो डुप्लिकेट की अनुमति नहीं देती है।


3

मैंने इसे हल करने के लिए क्या किया -

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 (एप्लिकेशन की बाहरी फ़ाइलों निर्देशिका के अंदर मौजूद सभी फ़ाइलों को साझा करने के लिए FileProvider को छोड़ना)

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

और जावा वर्ग में -

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

3

इसने मेरे लिए भी काम किया। पूरा रास्ता देने के बावजूद मैंने रास्ता दिया "= चित्र" और इसने ठीक काम किया।

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

2

यह निर्भर करता है कि आप किस प्रकार का भंडारण करना चाहते हैं, आंतरिक या बाहरी

बाहरी भंडारण के लिए

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

लेकिन आंतरिक भंडारण के लिए, पथ के साथ सावधान रहें, क्योंकि यह getFilesDir () पद्धति का उपयोग करता है जिसका अर्थ है कि आपकी फ़ाइल एप्लिकेशन ("/") के लिए रूट निर्देशिका में स्थित होगी।

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

तो आपकी प्रदाता फ़ाइल इस तरह होनी चाहिए:

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

सभी उदाहरण यह मानते हैं कि उपयोगकर्ता बाहरी भंडारण का उपयोग कर रहा है। मुझे आंतरिक भंडारण में सहायता की आवश्यकता थी और इस उत्तर को खोजने में घंटों लग गए। धन्यवाद।
जीशान

2

उपरोक्त में से कोई भी मेरे लिए काम नहीं करता था, कुछ घंटों के डिबगिंग के बाद मुझे पता चला कि समस्या createImageFile()विशेष रूप से absolute pathबनाम में हैrelative path

मुझे लगता है कि आप लोग फोटो लेने के लिए आधिकारिक एंड्रॉइड गाइड का उपयोग कर रहे हैं। 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, यह वह स्थान है जहाँ फ़ाइल बनाई जाएगी। तो इस फ़ाइल का पूर्ण पथ प्राप्त करने के लिए, मैं बस का उपयोग करता हूं image.getAbsolutePath(), इस पथ का उपयोग किया जाएगा onActivityResultयदि आपको फोटो लेने के बाद बिटमैप छवि की आवश्यकता है

नीचे है file_path.xml, बस का उपयोग करें .ताकि यह निरपेक्ष पथ का उपयोग करता है

<paths>
    <external-path
        name="my_images"
        path="." />
</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();
        }
    }

2

मुझे यह त्रुटि मिल रही थी Failed to find configured root that contains...

निम्नलिखित कार्य मेरे मुद्दे को हल करता है

रेस / 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

Android आधिकारिक दस्तावेज़ का कहना है कि file_paths.xml होना चाहिए:

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

लेकिन इसे नवीनतम एंड्रॉइड में काम करने के लिए रास्ते के अंत में एक "/" होना चाहिए, जैसे:

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

Xml file_paths फ़ाइल में निम्न परिवर्तन ने मेरे लिए काम किया।

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

1

मुझे भी यही समस्या थी, मैंने इसके काम करने के लिए नीचे दिए गए कोड की कोशिश की।

1. बनाएँ Xmlfile: प्रदाता_पथ

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

2. मुख्य फ़ाइल

 <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. अपने जावा फ़ाइल में।

      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

अगर कुछ भी मदद नहीं करता है और आपको त्रुटि मिल रही है

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

फिर कुछ लाइन बदलने की कोशिश करें जैसे:

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

सेवा:

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

और xml फ़ाइल में:

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

जो अजीब है, क्योंकि मैं फ़ोल्डर का उपयोग करता हूं /images


.GetDir से .getFilesDir पर स्विच करने से मुझे मदद मिली। धन्यवाद!
दिमित्री पावलुकिन 10

1

मेरी समस्या गलत फाइल का नाम था : मैं file_paths.xmlरिस / एक्सएमएल के तहत बनाता हूं जबकि संसाधन provider_paths.xmlमैनिफेस्ट में सेट किया गया था :

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

मैं बदल provider_pathsगया file_pathsऔर समस्या हल हो गई।


1

यदि आपकी फ़ाइल पथ / संग्रहण / अनुकरण / 0 / "yourfile" की तरह है

आपको बस अपना FileProvider xml संशोधित करना होगा

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

जब शेयर फ़ाइल की आवश्यकता हो तब इस फ़ंक्शन को कॉल करें

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

यह Android M ~ Pie पर काम करता है


यह कार्य करता है! लेकिन क्या आप बता सकते हैं कि हम पथ का उपयोग क्यों करते हैं = "।" पथ के बजाय = "DCIM", "चित्र" ...?
होआंग लाम

@ होंग लाम अंतर यह है कि क्या आपको एक निर्देशिका निर्दिष्ट करने की आवश्यकता है, मेरे उदाहरण में आप सभी का उपयोग कर सकते हैं
आलसी

0

मैं देख रहा हूं कि कम से कम आप दूसरों को file_paths.xml के समान पथ प्रदान नहीं कर रहे हैं। तो कृपया सुनिश्चित करें कि आप 3 स्थानों में समान पैकेज नाम या पथ प्रदान करते हैं:

  • android:authorities प्रकट में विशेषता
  • path file_paths.xml में विशेषता
  • authority FileProvider.getUriForFile () कॉल करते समय तर्क।

0
  • के लिए Xamarin.Android उपयोगकर्ताओं

यह एंड्रॉइड 7.1, 8.0+ को लक्षित करते समय अपने समर्थन पैकेज को अपडेट नहीं करने का परिणाम भी हो सकता है। उन्हें v25.4.0.2 + पर अपडेट करें और यह विशेष त्रुटि दूर हो सकती है (जिससे आप अपनी file_path फ़ाइल को अन्य लोगों की तरह सही तरीके से कॉन्फ़िगर कर सकते हैं)।


संदर्भ देते हुए: मैंने Xamarin.Forms ऐप में नूगा से ओरियो को लक्षित करने के लिए स्विच किया और Xam.Plugin के साथ एक तस्वीर ले ली ।मीडिया ने उपरोक्त त्रुटि संदेश के साथ विफल होना शुरू कर दिया, इसलिए संकुल को अपडेट करने से मेरे लिए चाल ठीक हो गई।


0

मैंने देखा कि path.xmlसमर्थन लाइब्रेरी 26 और 27 के बीच फ़ाइल के बारे में नीति या व्यवहार बदल गया है। कैमरे से तस्वीर कैप्चर करने के लिए, मैंने निम्नलिखित बातें देखीं:

  • 26 के साथ, मुझे उपयोग करना था <external-path>और pathतर्क में दिया गया पूर्ण पथ ।

  • 27 के साथ, मुझे तर्क <external-files-path>में केवल सबफ़ोल्डर का उपयोग करना था path

तो क्या विशेष रूप से मेरे लिए समर्थन लाइब्रेरी 27 के साथ काम किया क्योंकि path.xmlफ़ाइल थी

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

0

हेलो फ्रेंड्स यह ट्राय करो

इस कोड में

1) मैनिफेस्ट में 2 फाइल प्रोवाइडर को कैसे डिक्लेयर करें।

2) फ़ाइल डाउनलोड के लिए पहले प्रदाता

3) दूसरा प्रदाता कैमरा और गैलरी के लिए उपयोग किया जाता है

चरण 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>

दूसरा प्रदाता

     <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

कक्षा बनाएँ MyFileProvider (केवल कक्षा बनाएँ कोई विधि नहीं घोषित करें)

जब आपने इस नाम का इस्तेमाल किया फ़ाइल प्रदाता (.fileprovider) का इस्तेमाल किया और आपने छवि (.provider) का उपयोग किया।

यदि इस कोड को समझने के लिए कोई समस्या है तो आप rp1741995@gmail.com पर संपर्क कर सकते हैं।


0

समस्या सिर्फ xml पथ नहीं हो सकती है।

निम्नलिखित मेरी तय है:

मूल पाठ्यक्रम में देख रहे हैं 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);
        }

        // ...
    }

इस साधन mRootsमें अनुरोधित uri का टैग होना चाहिए। इसलिए मैं कुछ कोड लिखता हूं mRootsऔर यूआरआई के टैग को प्रिंट करता हूं , और फिर आसानी से लगता है कि टैग मेल नहीं खाते हैं

यह पता चलता है कि प्रदाता प्राधिकरण स्थापित ${applicationID}.providerकरना एक मूर्ख विचार है ! यह प्राधिकरण इतना सामान्य है कि अन्य प्रदाताओं द्वारा उपयोग किया जा सकता है, जो पथ विन्यास को गड़बड़ कर देगा!


-1

आपको xml फ़ाइल file_paths.xml से बदलनी होगी

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

सेवा

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

1
हालाँकि आपने अपने उत्तर की नकल ऊपर से की है, यह ठीक से नहीं किया गया है। कृपया अपने उत्तर में टाइपिंग मिसमैच को सही करें।
अभिनव सक्सेना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.