2010-05-18 13 views
46

जे 2 एमई में, मैं उस तरह यह कर दिया है: getClass().getResourceAsStream("/raw_resources.dat");एंड्रॉइड कच्चे संसाधनों तक पहुंच कैसे प्राप्त करें जिन्हें मैंने res फ़ोल्डर में रखा है?

लेकिन एंड्रॉयड में, मैं हमेशा इस पर अशक्त हो, क्यों?

+17

एंड्रोई के लिए प्रोग्रामिंग के बीच एक बड़ा अंतर है डी और जे 2 एमई – Janusz

+3

एंड्रॉइड और जे 2 एमई पर समान रूप से काम करने वाली किसी चीज़ के बारे में एक प्रश्न पर ऐसी टिप्पणी पढ़ने के लिए मजाकिया है। मेरा जवाब देखें – 0xF

उत्तर

25
InputStream raw = context.getAssets().open("filename.ext"); 

Reader is = new BufferedReader(new InputStreamReader(raw, "UTF8")); 
+18

कृपया समूह (नीचे) द्वारा उत्तर देखें, यह अधिक सटीक है। – BoD

+1

एक साइड नोट के रूप में, कच्चे फ़ोल्डर फ़ाइल नाम से एक्सेस की अनुमति नहीं देता है। कुछ ऐप्स को गतिशील फ़ाइल नामों की आवश्यकता होती है, इसलिए ऐसे मामलों में 'संपत्ति' फ़ोल्डर उपयोगी होता है – Caner

+8

उसने संपत्ति के बारे में नहीं पूछा/उसने रेस/कच्चे/ –

111

कच्ची फ़ाइलों के लिए, आपको Res निर्देशिका के अंदर कच्चे फ़ोल्डर बनाने पर विचार करना चाहिए और फिर अपनी गतिविधि से getResources().openRawResource(resourceName) पर कॉल करना चाहिए।

+0

समूह, आपके उत्तर के लिए धन्यवाद, अगर मैं ऐसा करता हूं, तो मुझे एंड्रॉइड एक्सएमएल प्रारूप समस्या में त्रुटियां मिली हैं, क्योंकि मैं मानक एक्सएमएल का उपयोग नहीं करता हूं, क्या इसका उपयोग वास्तव में कच्चे डेटा के रूप में करने का दूसरा तरीका है? – Arkaha

+0

गैर मानक एक्सएमएल द्वारा आपका क्या मतलब है? आप एक्सएमएल फाइलों को संपत्तियों में भी बंडल कर सकते हैं। – Samuh

+0

समूह, मैं j2me एप्लिकेशन पोर्ट कर रहा हूं, और इसमें एक्सटेंशन * .xml के साथ फाइलें हैं, ऐसी फाइलों की सामग्री xml के समान ही है, लेकिन समान नहीं है, इस फाइल पर चिल्लाना ग्रहण करता है, क्योंकि यह इसे संकलित नहीं कर सकता है। शायद मैं इस फाइल पर किसी प्रकार का "अनदेखा" सेट कर सकता हूं? लेकिन मुझे नहीं पता .. – Arkaha

3
TextView txtvw = (TextView)findViewById(R.id.TextView01); 
     txtvw.setText(readTxt()); 

private String readTxt() 
    { 
    InputStream raw = getResources().openRawResource(R.raw.hello); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    int i; 
    try 
    { 
     i = raw.read(); 
     while (i != -1) 
     { 
      byteArrayOutputStream.write(i); 
      i = raw.read(); 
     } 
     raw.close(); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 

     e.printStackTrace(); 
    } 


    return byteArrayOutputStream.toString(); 

} 

TextView01 :: LinearLayout में txtview हैलो :: रेस में .txt फ़ाइल/कच्चे फ़ोल्डर (यू wel के रूप में ny othr फ़ोल्डर तक पहुँच सकते हैं)

प्रथम 2 लाइनों 2 onCreate में लिखे गए हैं() विधि

बाकी कक्षा विस्तार गतिविधि में लिखा जाना है !!

12

हम छवि नाम का उपयोग drawable या कच्चे फ़ोल्डर से छवि प्राप्त करने के लिए कुछ स्थितियों में बजाय अगर = getResources में उत्पन्न आईडी

// Image View Object 
     mIv = (ImageView) findViewById(R.id.xidIma); 
// create context Object for to Fetch image from resourse 
Context mContext=getApplicationContext(); 

// getResources().getIdentifier("image_name","res_folder_name", package_name); 

// find out below example 
    int i = mContext.getResources().getIdentifier("ic_launcher","raw", mContext.getPackageName()); 

// now we will get contsant id for that image  
     mIv.setBackgroundResource(i); 
+4

यह पंक्ति: int i = mContext.getResources()। GetIdentifier (" ic_launcher "," कच्चे ", mContext.getPackageName()); गोल्ड – Radu

2

InputStream() openRawResource (ResourceName)।

यह सही तरीके से काम करेगा। इससे पहले आपको कच्चे संसाधन में एक्सएमएल फ़ाइल/टेक्स्ट फ़ाइल बनाना होगा। फिर यह सुलभ होगा।


लेआउट फ़ाइल या छवि नामों में कोई त्रुटि होने पर com.andriod.R को आयात किया जाएगा। तो आपको पैकेज को सही तरीके से आयात करना होगा, फिर केवल कच्ची फ़ाइल ही पहुंच योग्य होगी।

+1

openRawResource() को एक int की आवश्यकता नहीं है, एक स्ट्रिंग नहीं है http://developer.android.com/reference/android/content/res/Resources.html#openRawResource(int) – mmathieum

+0

यह उन संसाधनों पर भी काम करेगा जो मौजूद हैं खींचने योग्य फ़ोल्डर? –

+1

int के रूप में "R.raw.NameOfResource" का उपयोग करें। – CristianCV

3

getClass().getResourcesAsStream() एंड्रॉइड पर ठीक काम करता है। बस सुनिश्चित करें कि आप जिस फ़ाइल को खोलने की कोशिश कर रहे हैं वह आपके एपीके में सही ढंग से एम्बेडेड है (एपीके को ज़िप के रूप में खोलें)।

आम तौर पर एंड्रॉइड पर आप assets निर्देशिका में ऐसी फ़ाइलें डालते हैं। तो अगर आप अपनी परियोजना के assets उपनिर्देशिका में raw_resources.dat शब्दों में कहें, वह APK के assets निर्देशिका में खत्म हो जाएगा और आप का उपयोग कर सकते हैं:

getClass().getResourcesAsStream("/assets/raw_resources.dat"); 

यह भी निर्माण प्रक्रिया को अनुकूलित करने के लिए संभव है कि फ़ाइल एपीके में assets निर्देशिका में नहीं है।

0

एक अग्रिम दृष्टिकोण एक्सटेंशन समारोह उपयोग कर रहा है

fun Context.getRawInput(@RawRes resourceId: Int): InputStream { 
    return resources.openRawResource(resourceId) 
} 

एक और दिलचस्प बात यह है

उदाहरण के लिए आप बिना सुरुचिपूर्ण ढंग से इनपुट स्ट्रीम के साथ काम कर सकते हैं विस्तार समारोह उपयोग कि closeable दायरे में परिभाषित किया जाता है अपवाद और स्मृति प्रबंधन

fun Context.readRaw(@RawRes resourceId: Int): String { 
    return resources.openRawResource(resourceId).bufferedReader(Charsets.UTF_8).use { it.readText() } 
} 
संबंधित मुद्दे