2012-08-23 9 views
19

मेरी स्प्लैश स्क्रीन में, मैं यह जांचना चाहता हूं कि फोन में एसडीकार्ड है या नहीं। अब तक तो अच्छाजांचें कि एसडीकार्ड मौजूद है या नहीं, बूलियन हमेशा सत्य है

Boolean isSDPresent = android.os.Environment.getExternalStorageState() 
      .equals(android.os.Environment.MEDIA_MOUNTED); 

तो, अगर मैं अपने फ़ोन पर स्लॉट में SDCard है, यह बूलियन सच वापस आ जाएगी,: बूलियन बयान के नीचे है। जब मैं सेटिंग्स मेनू से "एसडीकार्ड अनमाउंट" पर जाता हूं, और एसडीकार्ड को हटा देता हूं, तो ऐप को मारता है और इसे फिर से लॉन्च करता है, बूलियन भी सच होगा ..

और यदि मैंने अनमाउंटिंग और हटाने के बाद Astro File Manager लॉन्च किया sdcard, मैं अभी भी /mnt/sdcard पथ तक पहुंच सकता हूं, क्यों?

मैं इसे पूरा करने के लिए कैसे प्रबंधित कर सकता हूं?

अग्रिम धन्यवाद!

संपादित

निम्न कोड के साथ परीक्षण:

File path = Environment.getExternalStorageDirectory(); 
String pathS = path.getPath(); 

जब SDCard स्लॉट में है, pathSmnt/sdcard होता है, लेकिन जब मैं SDCard को हटा pathS अभी भी /mnt/sdcard है ..

+0

आप किस डिवाइस का उपयोग कर रहे हैं? –

+0

सैमसंग गैलेक्सी एस 3 –

+0

ब्रायनस्टे का जवाब शायद सही है। क्या आप पर्यावरण के आउटपुट लॉग कर सकते हैं .getExternalStorageDirectory() और हमें बताएं? –

उत्तर

12

मुझे पता चला है कि सैमसंग से गैलेक्सी फोन की तरह फोन, /mnt/sdcard इंटरनेशनल के लिए बिंदु है एल स्मृति और अपेक्षित के रूप में बाहरी एसडी कार्ड नहीं।

नोट:

तुम्हें पता कर सकते हैं अगर पथ Environment.getExternalStorageDirectory() द्वारा दिया वास्तव में Environment.isExternalStorageRemovable()

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

+0

मैं सैमसंग गैलेक्सी एस 3 पर इसका परीक्षण कर रहा हूं, यह डरावना है। बहुत अजीब! –

+0

एस 3 के लिए, मैंने पाया है कि 'बाहरी_एसडी' पर/mnt/sdcard नामक एक निर्देशिका है जो एसडी कार्ड को ही इंगित करती है। दरअसल, मैंने अभी अपना कोड चेक किया है और एस 3 में पथ '/ mnt/extSdCard' में बाह्य एसडी भी हो सकता है। – brianestey

+1

यह केवल एपीआई लेवल 9 + –

2

यह होना चाहिए नहीं:

boolean isPresent = Environment.getExternalStorageState().equals(
    Environment.MEDIA_MOUNTED 
); 
Environment.getExternalStorageState() के लिए

प्रलेखन राज्यों के रूप में:

प्राथमिक "बाहरी" भंडारण युक्ति की वर्तमान स्थिति हो जाता है।

और Environment.MEDIA_MOUNTED-constant के लिए:

getExternalStorageState() रिटर्न MEDIA_MOUNTEDअगर मीडिया मौजूद है और उसके माउंट बिंदु पढ़ने/लिखने के लिए एक्सेस साथ में रखा होगा।

और यह एपीआई स्तर से काम करेंगे 1 +

+0

मेरे उत्तर में नोट देखें। गैलेक्सी फोन में आंतरिक मेमोरी है जो इसे "बाहरी" स्टोरेज के रूप में उपयोग करती है। – brianestey

+0

@brianestey विधियों को अभी भी वही लागू करना चाहिए। "बाहरी" शब्द प्रत्येक दस्तावेज़ित विधियों के लिए सापेक्ष है। मैंने इसका परीक्षण नहीं किया है, लेकिन इसे ठीक काम करना चाहिए। –

+1

गैलेक्सी फोन के लिए, बाहरी स्टोरेजस्टेट हमेशा माउंट किया जाता है क्योंकि जिसे "बाहरी" कहा जाता है वास्तव में फोन में बनाया जाता है। – brianestey

-2

यह कोड स्निपेट आप का पता लगाने और सैमसंग उपकरणों को छोड़कर, से निपटने के लिए के लिए काम का हो सकता:

public static String getExternalStorage() { 

    String str = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    if (isSamsungDevice()) { 
     if (isSamsungExternalSDMounted()) { 
      str += "/external_sd"; 
     } 
    } 
    return str; 
} 

private static boolean isSamsungDevice() { 

    return new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/external_sd").exists(); 
} 

private static boolean isSamsungExternalSDMounted() { 

    return exec("mount").indexOf("external_sd") >= 0; 
} 

public static String exec(String paramString) { 

    try { 
     String str = ""; 
     InputStream localInputStream = Runtime.getRuntime().exec(paramString).getInputStream(); 
     byte[] arrayOfByte = new byte[1024]; 
     StringBuilder localStringBuilder = new StringBuilder(); 
     while (true) { 

      int i = localInputStream.read(arrayOfByte, 0, arrayOfByte.length); 
      if (i == -1) { 
       str = localStringBuilder.toString(); 
       break; 
      } 

      localStringBuilder.append(new String(arrayOfByte, 0, i)); 
     } 

     return str; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+2

दुर्भाग्य से यह नवीनतम फोन के लिए काम नहीं कर रहा है, क्योंकि उनके पास बाहरी_एसडी नहीं है लेकिन ExtSdCard – Waypoint

2

मैं modificated कि अगर एसडी कार्ड मौजूद है, वहाँ पथ सेट नहीं आंतरिक निर्देशिका

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
    if(isSDPresent) 
    { 
     path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder"; 
    } 
    else 
    { 
     path = theAct.getFilesDir() + "/GrammarFolder"; 
    } 
1

तो आप पानी पर यह सेट करता है, तो NT दिखाने के लिए sdcard या नहीं डाला गया है या नहीं तो बस कॉपी-पेस्ट सभी उपकरणों के लिए इस कोड को अपनी कार्यशील 100%, कोड यहाँ है:

File file = new File("/mnt/extSdCard"); 
     try 
     { 
     File list[] = file.listFiles(); 
     Toast.makeText(getApplicationContext(), "Yes sdcard is mounted, file count "+list.length, Toast.LENGTH_LONG).show(); 
     } 
     catch(NullPointerException o) 
     { 
     Toast.makeText(getApplicationContext(), "Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show(); 
     } 
+0

धन्यवाद! यह ** Environment.isExternalStorageRemovable() ** से अधिक सटीक प्रतीत होता है या ** पर्यावरण .getExternalStorageState() की जांच करता है। (पर्यावरण .MEDIA_MOUNTED) बराबर है **। मैंने डालने/निकालने और एसडीकार्ड डालने के दौरान इन तीनों तरीकों पर इन तीन तरीकों का परीक्षण किया। – cking24343

0

हम दो स्मृति स्थिति है। एक आंतरिक मेमोरी कार्ड है और दूसरा बाहरी एसडी कार्ड है। यह डिवाइस पर निर्भर करता है कि उन्होंने मेमोरी कार्ड पथ का निर्माण कैसे किया है। इसलिए यदि आप एसडी कार्ड की उपलब्धता की जांच कर रहे हैं तो आंतरिक मेमोरी के कारण दोनों मामलों में यह सच हो सकता है। तो इस विधि के लिए जाना: यदि listOfInternalAndExternalStorage एक से अधिक है तो यह बाह्य भंडारण है

File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null); 
    if(listOfInternalAndExternalStorage.length>=2){ 
    // it contains sd card 
    } 

कोड ऊपर जाँच करेगा, अन्यथा यह एसडी कार्ड शामिल नहीं है।

संबंधित मुद्दे