GetExternalFilesDir और getExternalStorageDirectory () के बीच अंतर


89

मैं समझता हूं कि बाहरी 8 एपीआई और 8 पर इस्तेमाल किया जाना है और getExternalStorageDirectory 7 और नीचे के लिए है। हालांकि मैं उपयोग के बीच थोड़ा भ्रमित हूं। उदाहरण के लिए, मैं जाँच करना चाहता था कि एक फ़ोल्डर मौजूद है और पहले आप कुछ का उपयोग करेंगे जैसे:

File ChildFolder = new File(Environment.getExternalStorageDirectory() + "/ParentFolder/Child");

हालाँकि हर उदाहरण मैं देख रहा हूँ कि getExternalFilesDir (null), File.ext का उपयोग करें। चूंकि मैं एपीआई 8 से ऊपर हूं इसलिए मैं इस पद्धति का उपयोग करना चाहता हूं लेकिन मैं सिर्फ एक फ़ोल्डर की जांच कैसे करूं? मैं एक और बिंदु पर एक फाइल के अस्तित्व की जांच करूंगा लेकिन अभी के लिए यह देखना चाहता हूं कि क्या फ़ोल्डर मौजूद हैं ??

जवाबों:


132
getExternalFilesDir()

यह एंड्रॉइड / डेटा / डेटा / your_package / आपके एसडी कार्ड के अंदर फ़ाइलों के फ़ोल्डर का पथ देता है । इसका उपयोग आपके एप्लिकेशन के लिए किसी भी आवश्यक फ़ाइलों को संग्रहीत करने के लिए किया जाता है (जैसे वेब या कैश फ़ाइलों से डाउनलोड की गई छवियां)। एक बार ऐप को अनइंस्टॉल करने के बाद, इस फ़ोल्डर में संग्रहीत कोई भी डेटा चला गया है।

getExternalStorageDirectory()

यह आपके एसडी कार्ड (जैसे mnt / sdcard / ) के लिए रूट पथ लौटाता है । यदि आप इस पथ पर डेटा सहेजते हैं और ऐप की स्थापना रद्द करते हैं, तो वह डेटा खो नहीं जाएगा।


4
Google Android चाहता है कि आप ढांचे के भीतर जो कुछ भी प्रदान करते हैं, उसका उपयोग करें। तो अपनी पसंद और डिजाइन आवश्यकताओं के अनुसार। यदि आप नहीं चाहते हैं कि जब एप्लिकेशन अनइंस्टॉल हो जाए तो फाइलें शेष रहें, तो आपको getExternalFilesDir () या getExternalCacheDir ()
waqaslam

5
एपीआई 8 में इसकी वजह से, उन्होंने उन्नत मीडिया स्कैनर सुविधाओं को पेश किया, जो संगीत, चित्र, रिंगटोन आदि जैसे फ़ोल्डरों से डेटा को स्कैन करने की अनुमति देता है। वे निर्देशिकाएं स्वचालित रूप से केवल तभी बनाई जाती हैं जब आप getExternalFilesDir () का उपयोग करते हैं । अब चूंकि यह सुविधा एपीआई 7 में उपलब्ध नहीं थी, इसलिए उन्होंने getExternalStorageDirectory () का उपयोग करने की सिफारिश की । सरल ...
वाकासलाम

2
ठीक है, इसे कुछ समय दें, जल्द ही एक यूरेका
मोमेंट होगा

3
यह जानना महत्वपूर्ण है कि getExternalStorageDirectory()जरूरी नहीं है - शायद आमतौर पर भी नहीं - "अपने एसडी कार्ड के लिए पथ" लौटें। इसके बजाय यह "प्राथमिक बाहरी संग्रहण निर्देशिका" लौटाता है। डॉक्स ( developer.android.com/reference/android/os/… ) कहते हैं:
लार्स

2
'नोट: यहाँ "बाहरी" शब्द से भ्रमित न हों। इस निर्देशिका को मीडिया / साझा भंडारण के रूप में बेहतर माना जा सकता है। यह एक फाइलसिस्टम है जो अपेक्षाकृत बड़ी मात्रा में डेटा पकड़ सकता है और जिसे सभी अनुप्रयोगों में साझा किया जाता है (अनुमति लागू नहीं करता है)। परंपरागत रूप से यह एक एसडी कार्ड है , लेकिन इसे एक डिवाइस में बिल्ट-इन स्टोरेज के रूप में भी लागू किया जा सकता है जो कि संरक्षित आंतरिक स्टोरेज से अलग है और इसे कंप्यूटर पर फाइल सिस्टम के रूप में रखा जा सकता है। '
लार्स

69

सबसे पहले, हमें यह समझने की जरूरत है कि आंतरिक भंडारण, बाहरी संग्रहण (उर्फ प्राथमिक बाहरी भंडारण) और माध्यमिक बाहरी भंडारण में क्या अंतर है?

आंतरिक स्टोरेज: वह स्टोरेज है जो इंस्टॉल किए गए एप्स (या अपने डिवाइस को रूट करके) को छोड़कर यूजर द्वारा एक्सेस नहीं किया जाता है। उदाहरण: डेटा / डेटा / app_packageName

प्राथमिक बाहरी संग्रहण: बिल्ट शेयर्ड स्टोरेज में जो "USB केबल में प्लगिंग करके और इसे होस्ट होस्ट पर ड्राइव के रूप में बढ़ते हुए" यूजर द्वारा एक्सेस किया जाता है। उदाहरण: जब हम Nexus 5 32 GB कहते हैं।

सेकेंडरी एक्सटर्नल स्टोरेज: रिमूवेबल स्टोरेज। उदाहरण: एसडी कार्ड।

getExternalFilesDir (String type)

यह एंड्रॉइड / डेटा / डेटा / your_package / प्राथमिक बाहरी संग्रहण पर फ़ाइल फ़ोल्डर के लिए पथ देता है। जो इनबिल्ट स्टोरेज है।

Environment.getExternalStorageDirectory(type)

यह द्वितीयक बाह्य संग्रहण निर्देशिका का पथ लौटाएगा


विभिन्न प्रकार के भंडारण की व्याख्या करने के लिए धन्यवाद। हालाँकि, शायद संपादित करें आंतरिक कॉल आइटम को करने के लिए यह उल्लेख करें कि उस मान को प्राप्त करने के लिए विधि कॉल getFilesDir () है। ठीक है, मुझे लगता है कि विधि वास्तव में डेटा / डेटा / app_packageName / files लौटाती है लेकिन यह अभी भी आंतरिक भंडारण है।
राडदेवस

3
@VicJordan कृपया File getExternalStoragePublicDirectory (String type)और के बारे में लिखेंFile getFilesDir () साथ ही साथ
AnV

2
धन्यवाद विक। Environment.getExternalStorageDirectory () आउटपुट / स्टोरेज / इम्यूलेटेड / 0
gimmegimme

क्या आपके पास इस कथन के लिए कोई दस्तावेज है कि प्राथमिक बाहरी भंडारण बिल्ट-इन है, जबकि माध्यमिक हमेशा हटाने योग्य होता है? मैंने सोचा कि वे स्वतंत्र मुद्दे थे ... कुछ फोन में "बाहरी" भंडारण नहीं होता है, इस स्थिति में प्राथमिक बाहरी भंडारण एसडी कार्ड हो सकता है।
लार्ष

@ लार्स, मेरी जानकारी के अनुसार वर्तमान में बाजार में कोई फोन नहीं है या भविष्य में नहीं आ रहा है जिसमें बिल्ट-इन प्राइमरी एक्सटर्नल स्टोरेज नहीं होगा। जिंजरब्रेड के समय फोन थे जब ऐसे फोन मौजूद थे लेकिन अब नहीं हैं। क्या आप "कुछ" फोन नाम रख सकते हैं, जिनमें अंतर्निहित "प्राथमिक बाहरी भंडारण" नहीं है?
विकासदीप सिंह

17

! महत्वपूर्ण अद्यतन! जो भी इस प्रश्न के पार आता है।

जैसा कि यह एक पुराना सवाल है, कुछ अतिरिक्त जानकारी प्रदान करना चाहता था। चूंकि किटकैट भी उन ऐप्स WRITE_EXTERNAL_STORAGE अनुमति कर रहे हैं केवल अनुमति के लिए लिखने के लिए एंड्रॉयड / डेटा / डाटा / your_package / बाह्य भंडारण पर, उर्फ getExternalFilesDir()

यदि आप लिखने की कोशिश करेंगे तो आपको getExternalStorageDirectory() + "/somefolder/anotherfolder/"अधिकांश उपकरणों पर एक SecurityException मिलेगी


9
डॉक्स के अनुसार, ऐसे ऐप्स जिनके पास WRITE_EXTERNAL_STORAGE अनुमति है, वे अन्य पैकेजों के बाहरी भंडारण के लिए लिख सकते हैं, न कि केवल अपने। यह ऐसे एप्लिकेशन हैं जिनकी अनुमति नहीं है जो केवल अपनी स्वयं की निर्देशिका को लिख सकते हैं: developer.android.com/reference/android/content/… "KITKAT में शुरू, किसी भी अनुमतियों को पढ़ने या दिए गए पथ पर लिखने की आवश्यकता नहीं है; यह हमेशा है; कॉलिंग ऐप के लिए सुलभ ... अन्य पैकेजों से संबंधित रास्तों तक पहुंचने के लिए WRITE_EXTERNAL_STORAGE और / या READ_EXTERNAL_STORAGE की आवश्यकता है। "
Oded

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

7
यह आपके उत्तर में गलत जानकारी को संबोधित नहीं करता है। "चूंकि किटकैट यहां तक ​​कि ऐसे ऐप्स जिनमें WRITE_EXTERNAL_STORAGE हैं, उन्हें केवल Android / डेटा / डेटा / your_package / बाह्य संग्रहण पर लिखने की अनुमति है, उर्फ ​​getExternalFilesDir ()"। डॉक्स के अनुसार, यह गलत है। WRITE_EXTERNAL_STORAGE के साथ, ऐप्स सभी बाहरी संग्रहण को लिख सकते हैं।
ऊद

1
@Oded, क्या आपने यह परीक्षण किया है? डॉक्स की मेरी समझ, और किटकैट और बाद के उपकरणों के साथ मेरा अनुभव, आप से अलग है। (काश, मेरे पास अभी सभी विवरणों को हैश करने का समय होता। शायद बाद में।) मेरा अनुभव है कि एसजीएएल सही है। फिर लॉलीपॉप भी है जो थोड़ा अलग है।
लार्स

2
Android के प्रलेखन के अनुसार, यह उत्तर स्पष्ट रूप से गलत है। डेवलपर देखें ।android.com/reference/android/… "एपीआई स्तर 19 में शुरू होने से, इस अनुमति को getExternalFilesDir (स्ट्रिंग) और getExternalCacheDir () द्वारा लौटाए गए आपके एप्लिकेशन-विशिष्ट निर्देशिकाओं में फ़ाइलों को पढ़ने / लिखने की आवश्यकता नहीं है।" (ध्यान दें कि एपीआई स्तर 19 = किटकैट।) कोई विचार नहीं है कि इसे कितने उत्थान मिले।
Ajedi32

6

!! महत्वपूर्ण !!

Environment.getExternalStorageDirectory()को हटा दिया गया है और संदर्भ # getExternalFilesDir (स्ट्रिंग), MediaStore, या इरादे # ACTION_OPEN_DOCUMENT, का उपयोग किया जाना चाहिए।

इस विधि को एपीआई स्तर 29 में पदावनत किया गया था। उपयोगकर्ता की गोपनीयता में सुधार करने के लिए, साझा / बाहरी भंडारण उपकरणों तक सीधी पहुंच को सीमित किया गया है। जब कोई एप्लिकेशन Build.VERSION_CODES.Q को लक्षित करता है, तो इस पद्धति से दिया गया पथ अब सीधे ऐप्स तक पहुंच योग्य नहीं होता है। ऐप्स प्रसंग # getExternalFilesDir (स्ट्रिंग), MediaStore, या इरादे # ACTION_OPEN_DOCUMENT जैसे विकल्पों पर माइग्रेट करके साझा / बाह्य संग्रहण पर संग्रहीत सामग्री तक पहुंच जारी रख सकते हैं।

https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory ()

Android.M से शुरू होने वाले डेवलपर्स को रन टाइम पर अनुमति मांगनी होगी।

प्रलेखन में अधिक विवरण यहाँ देखें और यह प्रश्न

पर्यावरण .getExternalStorageDirectory () एपीआई स्तर 29 जावा में पदावनत


अगर किसी को स्टैक ओवरफ्लो लिंक की तलाश है और Google डॉक्स से पेस्ट की गई कोई कॉपी नहीं है तो यहां देखें stackoverflow.com/questions/57116335/…
रोवन बेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.