2011-04-23 17 views
13

मेरे पास एक ऐसा एप्लिकेशन है जो किसी सर्वर से डाउनलोड की गई फ़ाइलों को सहेजता है। ये फ़ाइलें मेरे आवेदन के लिए निजी नहीं हैं और अन्य अनुप्रयोगों के लिए भी उपलब्ध होनी चाहिए। मैं जानना चाहता हूं कि एसडी कार्ड के आस-पास होने पर इन फ़ाइलों को सहेजने का सही मार्ग क्या होगा।आंतरिक स्टोरेज में सार्वजनिक फ़ाइलों को सहेजना

getExternalStorageDirectory() 

आंतरिक स्मृति में आवेदन के निजी डेटा के लिए वहाँ है - - एसडी कार्ड के लिए, वहाँ अच्छी तरह से ज्ञात एपीआई है

Context.getFilesDir() 

कुछ उपकरणों पर, आंतरिक स्मृति/eMMC का प्रतिनिधित्व करती है /।

अगर कोई/emmc/पर विस्तार कर सकता है तो यह वास्तव में सहायक होगा। मुझे पता है कि यह एम्बेडेड मेमोरी कार्ड के लिए खड़ा है और सभी उपकरणों में मौजूद नहीं है। लेकिन क्या यह वास्तव में आंतरिक स्मृति का प्रतिनिधि है? या यह तीसरी याददाश्त है?

क्या मुझे openFileOutput()MODE_WORLD_READABLE के साथ फ़ाइलों को सहेजना चाहिए?

उत्तर

9

कुछ उपकरणों पर, आंतरिक मेमोरी/emmc/द्वारा दर्शाया जाता है।

/emmc/ कुछ उपकरणों पर मौजूद हो सकता है, और यह आंतरिक हो सकता है, लेकिन यह आवेदन करने के लिए सुलभ नहीं हो सकता है, और यह निश्चित रूप से Android SDK का एक भाग है, जब तक कि क्या getExternalStorageDirectory() रिटर्न होने वाला नहीं है।

लेकिन क्या यह वास्तव में आंतरिक स्मृति का प्रतिनिधि है?

सं

या यह तीसरा स्मृति है?

अपने डिवाइस निर्माता से पूछें।

क्या मुझे OpenFileOutput() का उपयोग MODE_WORLD_READABLE के साथ फ़ाइलों को सहेजना चाहिए?

अमूर्त में उत्तर देना असंभव है। आप कहते हैं कि आपकी फाइलें "अन्य अनुप्रयोगों के लिए भी पहुंच योग्य होनी चाहिए", लेकिन आपने यह संकेत नहीं दिया है कि आप किसी अन्य एप्लिकेशन को अपनी फ़ाइलों के बारे में कुछ देखभाल करने की अपेक्षा क्यों करते हैं। अन्य एप्लिकेशन फ़ाइलों के लिए आपकी निर्देशिका स्कैन नहीं करेंगे - सर्वोत्तम रूप से, वे उपयोगकर्ताओं को बाहरी संग्रहण ब्राउज़ करने की अनुमति देंगे। MODE_WORLD_READABLE फ़ाइल होने का एकमात्र कारण यह है कि आपका आवेदन फ़ाइल के साथ कुछ करने के लिए एक और एप्लिकेशन ट्रिगर करेगा (उदाहरण के लिए, ACTION_VIEWIntent)।

+0

धन्यवाद कॉमन्सवेयर! हां, मेरा आवेदन ACTION_VIEW के साथ अन्य अनुप्रयोगों को ट्रिगर करना बिल्कुल यही कारण है कि मैं इन फ़ाइलों को सार्वजनिक करता हूं। साथ ही, कुछ फ़ाइल एक्सप्लोरर और एप्लिकेशन एसडी कार्ड के साथ-साथ आंतरिक मेमोरी स्कैन करते हैं, मैं चाहता हूं कि वे इन फ़ाइलों को ढूंढ सकें। तो, मेरा सवाल बनी हुई है, एसडी कार्ड नहीं मिलने पर फ़ाइल को कहां से सहेजना है? – Akshay

+0

@ अक्षय: "इसके अलावा, कुछ फाइल एक्सप्लोरर और एप्लिकेशन एसडी कार्ड के साथ-साथ आंतरिक मेमोरी स्कैन करते हैं, मैं चाहता हूं कि वे इन फ़ाइलों को ढूंढ सकें।" - यह संभव नहीं है, या यदि यह है, तो यह एक प्रमुख सुरक्षा छेद है। "तो, मेरा सवाल बनी हुई है, एसडी कार्ड नहीं मिलने पर फ़ाइल को कहां से सहेजना है?" - 'getFilesDir() '। – CommonsWare

+0

धन्यवाद कॉमन्सवेयर! मैं इसे स्पष्ट रूप से समझने की कोशिश कर रहा हूं। मेरे एप्लिकेशन की तुलना किसी ऐसे ईमेल क्लाइंट से की जा सकती है जो अनुलग्नक डाउनलोड करती है और दस्तावेज़ फ़ाइलों और मीडिया प्लेयर को इन फ़ाइलों को खोलने की अनुमति देती है। एसडी कार्ड अनुपस्थित होने पर एक ईमेल क्लाइंट फाइलों को सहेज लेगा? आंतरिक स्मृति में कोई सार्वजनिक निर्देशिका नहीं है? कुछ/internal_memory/डाउनलोड की तरह? आप एक सुरक्षा छेद के रूप में आंतरिक स्मृति स्कैनिंग पर विचार क्यों करेंगे? बस पुष्टि करने के लिए, आंतरिक मेमोरी डिवाइस/फोन मेमोरी का तात्पर्य है, है ना? प्रश्नों की झुकाव के लिए खेद है। – Akshay

14

मुझे एहसास है कि यह पुराना है और इसका एक स्वीकार्य उत्तर है, लेकिन मुझे लगता है कि प्रश्न अभी भी प्रासंगिक है और यह पूछने का एक तरीका है कि पूछताछकर्ता क्या चाहता है।

पैराफ्रेश करने के लिए, मेरा मानना ​​है कि पूछताछकर्ता एक फाइल को सहेजना चाहता है, और बाहरी ऐप्स के बारे में सोचने के बिना इसे अन्य ऐप्स द्वारा सुलभ (उदाहरण के लिए) बनाना चाहता है (उदाहरण के लिए अतिरिक्त अनुमति और बाहरी संग्रहण है उपस्थित नहीं)।

यह पता चला है कि आप अपनी फ़ाइलों को अन्य ऐप्स द्वारा पठनीय बना सकते हैं।

File file = new File(ctx.getCacheDir(), "picture");    
... 
file.setReadable(true, false); 
    // makes file readable to other apps 

// Get another app to view my picture 
Uri uri = Uri.fromFile(file);   
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "image/*"); 
ctx.startActivity(intent); 

सेट रीडेबल ने मेरे लिए उपर्युक्त कोड काम किया - उस लाइन के बिना दर्शक ऐप फ़ाइल नहीं पढ़ सका। ध्यान दें कि सेट रीडेबल पूरी निर्देशिका पर चल रहा है, इसलिए सबसे अच्छा समाधान शायद उप-निर्देशिका नाम 'सार्वजनिक' बनाने और अपनी फ़ाइलों को वहां रखने के लिए है।

+3

आपका जीवनभर! स्वीकार्य उत्तर इस बात पर बहुत अधिक ध्यान केंद्रित करता है कि आपको ऐसा क्यों नहीं करना चाहिए और वास्तविक नहीं। –