2012-08-23 17 views
19

Sıçrama ekranımda, telefonun SDCard olup olmadığını kontrol etmek istiyorum. Boole ifadesi altında: Ben telefonumda yuvaya sdcard varsaSDCard'ın mevcut olup olmadığını kontrol edin, boole her zaman doğru

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

Yani, bu mantıksal doğru dönecektir, şimdiye kadar çok iyi. Ben ayarlar menüsünden "bağlantısını kesin sdcard" gidin ve sdcard kaldırır, sonra uygulamayı öldürmek ve yeniden başlatılması, boole da geçerli olacak ..

Ve unmounting ve çıkardıktan sonra Astro File Manager başlatırsa sdcard, hala /mnt/sdcard yoluna erişebiliyorum, neden?

Bunu nasıl başarmayı başarabilirim?

Şimdiden teşekkürler!

DÜZENLEME aşağıdaki kodla

Test:

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

SDCard yuvada

, pathS mnt/sdcard içerir, ama sdcard kaldırır pathS hala /mnt/sdcard olduğu ..

+0

Hangi aygıtı kullanıyorsunuz? –

+0

Samsung Galaxy S3 –

+0

brianestey'in cevabı muhtemelen doğrudur. Environment.getExternalStorageDirectory() çıktısını kaydedebilir ve bize bildirebilir misiniz? –

cevap

12

Samsung'un Galaxy telefonları gibi telefonların, interna için /mnt/sdcard noktasına sahip olduğunu öğrendim I bellek ve harici SD kart beklendiği gibi değil.

Not:

Environment.getExternalStorageDirectory() tarafından döndürülen yolu aslında

Environment.isExternalStorageRemovable() çağrısı ile harici SD kart olup olmadığını bilebilir Sadece) (getExternalStorageDirectory için dokümanlardan bu önemli bir not eklemek istedim : Burada "dış" kelimesiyle karıştırmayın. Bu dizin , medya/paylaşımlı depolama olarak düşünülebilir. 'un göreceli olarak büyük miktarda veri tutabildiği ve tüm uygulamalarda arasında paylaşıldığı bir dosya sistemidir (izinleri zorlamaz). Geleneksel olarak bu bir SD karttır, ancak bir SD karttır, fakat aynı zamanda korunan dahili depolamadan farklı olan bir cihazında yerleşik depolama olarak da uygulanabilir ve bir bilgisayar üzerinde dosya sistemi olarak monte edilen olabilir.

+0

Bunu Samsung Galaxy S3 üzerinde test ediyorum, bu garip. Oldukça garip! –

+0

S3 için, SD kartın kendisine işaret eden/mnt/sdcard'da 'external_sd' adlı bir dizinin bulunduğunu buldum. Aslında, sadece kodumu kontrol ettim ve S3 ayrıca harici sd '/ mnt/extSdCard' yolunda da olabilir. – brianestey

+1

Bu yalnızca API Seviye 9+ –

2

olması gerekmiyor: Environment.getExternalStorageState() belgeleri devletler olarak

boolean isPresent = Environment.getExternalStorageState().equals(
    Environment.MEDIA_MOUNTED 
); 

:

birincil "dış" depolama aygıtı ait mevcut durumunu alır.

Ve Environment.MEDIA_MOUNTED-constant için

:

getExternalStorageState() döner MEDIA_MOUNTEDmedya mevcut olup okuma/yazma erişimi ile bağlama noktasında monte eğer.

Ve algılayabilir ve Samsung cihazları hariç başa için

+0

Cevabımdaki nota bakın. Galaxy telefonların "harici" depolama olarak kullandıkları dahili belleği var. – brianestey

+0

@brianestey yöntemleri yine de aynı şekilde uygulanmalıdır. "Harici" sözcüğü, belgelenen yöntemlerin her biri için görelidir. Test etmedim ama işe yaramalı. –

+1

Galaxy telefonları için, externalStorageState her zaman monte edilir, çünkü "harici" olarak adlandırılan şey aslında telefona yerleştirilir. – brianestey

-2

Bu kod parçacığı kullanım olabilir 1+ bu API Seviye dan çalışacak: Ben modifiye edilmiş,

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

Bu ne yazık ki en yeni telefonlar için çalışmıyor, çünkü onlar harici_sd değil ama ExtSdCard – Waypoint

2

eğer sd kart, var değil mi wa ise iç dizine

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

adresten ayarlarsa orada yolunu belirler Biz iki bellek statüsüne sahip

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

Teşekkürler! Bu, ** Environment.isExternalStorageRemovable() ** ya da ** Environment.getExternalStorageState(). Equals (Environment.MEDIA_MOUNTED) ** kontrolünden daha doğru gibi görünüyor. Takarken/çıkarırken ve SDCard kullanırken bu yöntemlerin üçünü de bazı aygıtlarda test ettim. – cking24343

0

: nt sonra sadece-copy yapıştırmak tüm Cihazlar için bu kodu kendi çalışma% 100, kod burada sdcard takılı olup olmadığını göstermek için. Biri Dahili hafıza kartı ve diğeri harici sd kartı. Bu, cihaza bağlı olarak hafıza kartı yolunu nasıl ürettiklerini üretmektedir. Bu yüzden sd kart kullanılabilirliğini kontrol ediyorsanız, dahili bellek nedeniyle her iki durumda da doğru olabilir. Yani bu yöntem için gidin: listOfInternalAndExternalStorage biri o zaman harici depolama alanına sahip birden ise kod yukarıdaki

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

kontrol edecek, aksi takdirde sd kart içermez.