संपत्ति फ़ाइल से URI कैसे प्राप्त करें?


127

मैं एक एसेट फ़ाइल के लिए URI पथ प्राप्त करने का प्रयास कर रहा हूं।

uri = Uri.fromFile(new File("//assets/mydemo.txt"));

जब मैं जाँचता हूँ कि क्या फ़ाइल मौजूद है, तो मैं देखता हूँ कि फ़ाइल मौजूद नहीं है

File f = new File(filepath);
if (f.exists() == true) {
    Log.e(TAG, "Valid :" + filepath);
} else {
    Log.e(TAG, "InValid :" + filepath);
}

क्या कोई मुझे बता सकता है कि मैं एसेट फ़ोल्डर में मौजूद फ़ाइल के लिए निरपेक्ष पथ का उल्लेख कैसे कर सकता हूं

जवाबों:


160

"परिसंपत्ति फ़ोल्डर में मौजूद फ़ाइल के लिए कोई पूर्ण पथ नहीं है"। आपके प्रोजेक्ट के assets/फ़ोल्डर की सामग्री एपीके फ़ाइल में पैक की गई है। किसी संपत्ति पर AssetManagerप्राप्त करने के लिए एक वस्तु का उपयोग करें InputStream

इसके लिए WebView, आप file Uriउसी तरह से योजना का उपयोग कर सकते हैं जिस तरह से आप URL का उपयोग करेंगे। परिसंपत्तियों के लिए वाक्यविन्यास है file:///android_asset/...(नोट: तीन स्लैश) जहां assets/फ़ोल्डर के भीतर से फ़ाइल का मार्ग पथ है ।


32
file://android_asset/..., जहां ...आपकी परियोजना की assets/निर्देशिका के भीतर सापेक्ष पथ है ।
कॉमन्सवेयर

4
यहाँ एक नमूना परियोजना का उपयोग किया जा रहा है file://android_asset/, हालांकि इसके लिए नहीं Uri: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare

20
@CommonsWare ऐसा लगता है कि आप अपने URI में '/' से चूक गए हैं। यह होना चाहिए file:///
थॉमस डब्ल्यूडब्ल्यू

7
मैं इस के रूप में की कोशिश की new File("file:///android_asset/sounds/beep.mid");, लेकिन परिणाम फ़ाइल मौजूद नहीं है। कोई विचार? PS फ़ाइल assets/sounds/फ़ोल्डर में है।
चाचा लेम

3
क्या यह सही है कि ilefile: ///android_asset/... केवल WebView में काम करता है और WebView के बाहर URI / URL / Uri का उपयोग करके InputStream प्राप्त करना संभव नहीं है?
लोबो

74

सही यूआरएल है:

file:///android_asset/RELATIVEPATH

जहाँ RELATIVEPATH संपत्ति फ़ोल्डर के सापेक्ष आपके संसाधन का पथ है।

योजना में 3 / का ध्यान दें । वेब दृश्य बिना मेरी किसी भी संपत्ति को लोड नहीं करेगा। 3. मैंने कॉमन्सवेयर द्वारा टिप्पणी की गई (जैसा कि पहले 2) की कोशिश की और यह काम नहीं करेगा। फिर मैंने जिठूब पर कॉमन्सवेयर के स्रोत को देखा और अतिरिक्त फ़ॉरवर्ड स्लैश पर ध्यान दिया।

यह परीक्षण हालांकि केवल 1.6 एंड्रॉइड एमुलेटर पर किया गया था, लेकिन मुझे इसकी असली डिवाइस या उच्चतर संस्करण पर संदेह है।

संपादित करें: कॉमन्सवेयर ने इस छोटे से बदलाव को प्रतिबिंबित करने के लिए अपने उत्तर को अपडेट किया। इसलिए मैंने इसे संपादित किया है इसलिए यह अभी भी उसके वर्तमान उत्तर के साथ समझ में आता है।


अब काम नहीं करता है String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
Elgirhath

@Elgirhath Fileकि एक स्ट्रिंग स्वीकार करता है के लिए कंस्ट्रक्टर URI नहीं एक पथ की उम्मीद कर रहा है । मैंने कुछ वर्षों तक एंड्रॉइड के लिए कोड नहीं किया है और चीजें बदल सकती हैं। यदि आप एक सामान्य जावा फ़ाइल वर्ग का उपयोग करके एम्बेडेड एसेट फ़ोल्डर तक पहुँच सकते हैं तो मैं अनिश्चित हूँ। मुझे याद है कि आपको एक एसेट मैनजर का उपयोग करना है । संपत्ति फ़ोल्डर में फ़ाइलें केवल-पढ़ने वाले बंडल में डिवाइस पर रखी जाती हैं एपीके और संपीड़ित (एपीपी वास्तव में ज़िप फाइलें हैं), इस प्रकार इसे वापस पढ़ने के लिए और अधिक काम किया जाता है। कुछ इस तरह की कोशिश करेंnew File(new URI(filename))
रस

10

कृपया इस कोड को ठीक करने का प्रयास करें

 Uri imageUri = Uri.fromFile(new File("//android_asset/luc.jpeg"));

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();

8

अंत में, मुझे एक फाइल का रास्ता मिल गया, जो कोटलीन में इस उत्तर से संपत्ति में मौजूद है । यहां हम एसेट फाइल को कैशे में कॉपी कर रहे हैं और उस कैशे फाइल से फाइल पाथ प्राप्त कर रहे हैं।

@Throws(IOException::class)
    fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
            .also {
               if (!it.exists()) {
                it.outputStream().use { cache ->
                    context.assets.open(fileName).use { inputStream ->
                            inputStream.copyTo(cache)
                    }
                  }
                }
            }

फ़ाइल के लिए पथ प्राप्त करें जैसे:

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath

1
ध्यान दें कि यदि fileNameनिर्देशिका है dir/file। यह cache/dir/fileमौजूद नहीं पथ के साथ दुर्घटनाग्रस्त हो जाएगा । इसके अलावा, मुझे लगता है कि बेहतर ब्लॉक के if(!it.exist)अंदर एक जाँच है also, तो यह हर बार फ़ाइल की प्रतिलिपि नहीं करेगा यहां तक ​​कि फ़ाइल पहले से ही कैश पर है
येओंग

@ शीलेंद्रमड्डा, @ यंग, if(!it.exist)एक त्रुटि अनसुलझे संदर्भ को संदर्भित करता है। कोई भी समाधान ?
बिन्रेबिन

उस फ़ाइल के नाम के साथ आपके कैश में मौजूद फ़ाइल की जाँच करें? @ लेबरिन
शीलेंद्र मद्दा

@ शीलेंद्रमड्डा, मुझे केवल नाम पता है। क्या हम वास्तविक यूरी
बिन्रेबिन

मुझे लगता है कि if(!it.exist)इससे पहले रखना चाहिए it.outputStream()...
यंग

7

यहाँ छवि विवरण दर्ज करें

सुनिश्चित करें, आपकी संपत्ति फ़ोल्डर सही स्थिति में है।


आप इसे अपनी इच्छानुसार कहीं भी रख सकते हैं और अपनी build.gradle फ़ाइल में पथ को परिभाषित कर सकते हैंsourceSets { main { assets.srcDirs = ['src/main/assets'] } }
मार्सेल Bro

2
Hello.html का रास्ता कैसे प्राप्त करें? कृपया जोड़ें
रोहित सिंह

6

WebView के लिए काम करता है, लेकिन विफल रहता है URL.openStream()। तो आपको फ़ाइल को भेद करने की आवश्यकता है: // प्रोटोकॉल और उन्हें सुझाए अनुसार एसेटमैन के माध्यम से संभाल लें।


4

इसे आज़माएं, यह काम करता है:

InputStream in_s = 
    getClass().getClassLoader().getResourceAsStream("TopBrands.xml");

यदि आपको एक शून्य मान अपवाद मिलता है, तो यह प्रयास करें (वर्ग के साथ TopBrandData):

InputStream in_s1 =
    TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");

यदि काम नहीं कर रहा है, तो कृपया इसे आज़माएँ: InputStream in_s1 = TopBrandData.class.getResourceAsStream ("/ आस्तियाँ / TopBrands.xml");
जसप्रीत सिंह

3
InputStream is = getResources().getAssets().open("terms.txt");
String textfile = convertStreamToString(is);
    
public static String convertStreamToString(InputStream is)
        throws IOException {

    Writer writer = new StringWriter();
    char[] buffer = new char[2048];

    try {
        Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        int n;
        while ((n = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, n);
        }
    } finally {
        is.close();
    }

    String text = writer.toString();
    return text;
}

1

इसे इस्तेमाल करे :

Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.cat); 

मैंने किया था और यह काम किया


2
वास्तव में यह काम करता है। चेक ContentResolver.openAssetFileDescriptor
हिप्पो सात

1
काम किया। बहुत बहुत धन्यवाद। योग्य, मैं बस यूआरआई आंतरिक फ़ाइल प्राप्त करना चाहता हूं // क्रिएट रॉ फोल्डर इनसाइड आरईएस, यह नाम फ़ाइल का नाम केवल एक..z0..9 चरित्र, कोई उत्तर नहीं !!!
phnghue

0

हाँ, आप अपने ड्राइव फ़ोल्डर को एंड्रॉइड फोन या एमुलेटर से एक्सेस नहीं कर सकते हैं क्योंकि आपका कंप्यूटर और एंड्रॉइड दो अलग-अलग ओएस हैं। मैं एंड्रॉइड के रिस फ़ोल्डर में जाऊंगा क्योंकि इसमें अच्छे संसाधन प्रबंधन तरीके हैं। जब तक और आपके पास संपत्ति फ़ोल्डर में फ़ाइल डालने का बहुत अच्छा कारण न हो। इसके बजाय आप ऐसा कर सकते हैं

try {
      Resources res = getResources();
      InputStream in_s = res.openRawResource(R.raw.yourfile);

      byte[] b = new byte[in_s.available()];
      in_s.read(b);
      String str = new String(b);
    } catch (Exception e) {
      Log.e(LOG_TAG, "File Reading Error", e);
 }

-7

मेरे लिए काम किया इस कोड को आज़माएं

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
   String testfilepath = uri.getPath();
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.