2011-09-15 54 views
47

我的應用程序正在爲只有SD卡的手機工作。所以編程方式,我想檢查SD卡是否可用,以及如何找到SD卡的可用空間。可能嗎?檢查SD卡是否可用編程

如果是,我該怎麼做?

回答

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

if(isSDSupportedDevice && isSDPresent) 
{ 
    // yes SD-card is present 
} 
else 
{ 
// Sorry 
} 
+3

如何檢查SD卡的空閒內存? – naresh

+1

謝謝你它的工作 – naresh

+40

,但它返回true,如果手機有inbuild存儲..所以不是正確的答案 – User10001

12

如在"Using the External Storage"中所述使用Environment.getExternalStorageState()

要獲得外部存儲上的可用空間,使用StatFs

// do this only *after* you have checked external storage state: 
File extdir = Environment.getExternalStorageDirectory(); 
File stats = new StatFs(extdir.getAbsolutePath()); 
int availableBytes = stats.getAvailableBlocks() * stats.getBlockSize(); 
3
void updateExternalStorageState() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     mExternalStorageAvailable = mExternalStorageWriteable = true; 
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
     mExternalStorageAvailable = true; 
     mExternalStorageWriteable = false; 
    } else { 
     mExternalStorageAvailable = mExternalStorageWriteable = false; 
} 
handleExternalStorageState(mExternalStorageAvailable, 
     mExternalStorageWriteable); 
} 
5

我寫了一個小類爲該檢查存儲狀態。也許這對你有一些用處。

import android.os.Environment; 

/** 
* Checks the state of the external storage of the device. 
* 
* @author kaolick 
*/ 
public class StorageHelper 
{ 
// Storage states 
private boolean externalStorageAvailable, externalStorageWriteable; 

/** 
* Checks the external storage's state and saves it in member attributes. 
*/ 
private void checkStorage() 
{ 
// Get the external storage's state 
String state = Environment.getExternalStorageState(); 

if (state.equals(Environment.MEDIA_MOUNTED)) 
{ 
    // Storage is available and writeable 
    externalStorageAvailable = externalStorageWriteable = true; 
} 
else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) 
{ 
    // Storage is only readable 
    externalStorageAvailable = true; 
    externalStorageWriteable = false; 
} 
else 
{ 
    // Storage is neither readable nor writeable 
    externalStorageAvailable = externalStorageWriteable = false; 
} 
} 

/** 
* Checks the state of the external storage. 
* 
* @return True if the external storage is available, false otherwise. 
*/ 
public boolean isExternalStorageAvailable() 
{ 
checkStorage(); 

return externalStorageAvailable; 
} 

/** 
* Checks the state of the external storage. 
* 
* @return True if the external storage is writeable, false otherwise. 
*/ 
public boolean isExternalStorageWriteable() 
{ 
checkStorage(); 

return externalStorageWriteable; 
} 

/** 
* Checks the state of the external storage. 
* 
* @return True if the external storage is available and writeable, false 
*   otherwise. 
*/  
public boolean isExternalStorageAvailableAndWriteable() 
{ 
checkStorage(); 

if (!externalStorageAvailable) 
{ 
    return false; 
} 
else if (!externalStorageWriteable) 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 
} 
} 
+0

這個calss有助於檢測sd卡的可用性嗎? –

+0

@PankajNimgade本課程幫助您檢查外部存儲是否可用和/或可寫入。外部存儲器可以是SD卡或內置存儲器,如nexus設備。 – kaolick

+0

是否可以專門檢查「SD卡」?,在此先感謝 –

4

我修改了它,如果SD卡存在,它會在那裏設置路徑。如果沒有,則將其設置在內部目錄中。

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

我創建了一個類來檢查SD卡上的文件夾是否可用:

public class GetFolderPath { 

    static String folderPath; 

    public static String getFolderPath(Context context) { 
     if (isSdPresent() == true) { 
      try { 
       File sdPath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/FolderName"); 
       if(!sdPath.exists()) { 
        sdPath.mkdirs(); 
        folderPath = sdPath.getAbsolutePath(); 
       } else if (sdPath.exists()) { 
        folderPath = sdPath.getAbsolutePath(); 
       } 
      } 
      catch (Exception e) { 

      } 
      folderPath = Environment.getExternalStorageDirectory().getPath()+"/FolderName/"; 
     } 
     else { 
      try { 
       File cacheDir=new File(context.getCacheDir(),"FolderName/"); 
       if(!cacheDir.exists()) { 
        cacheDir.mkdirs(); 
        folderPath = cacheDir.getAbsolutePath(); 
       } else if (cacheDir.exists()) { 
        folderPath = cacheDir.getAbsolutePath(); 
       } 
      } 
      catch (Exception e){ 

      } 
     } 
     return folderPath; 
    } 

    public static boolean isSdPresent() { 
     return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
    } 
} 
0

這種簡單的方法是爲我工作。測試過所有類型的設備。

public boolean externalMemoryAvailable() { 
    if (Environment.isExternalStorageRemovable()) { 
     //device support sd card. We need to check sd card availability. 
     String state = Environment.getExternalStorageState(); 
     return state.equals(Environment.MEDIA_MOUNTED) || state.equals(
      Environment.MEDIA_MOUNTED_READ_ONLY); 
    } else { 
     //device not support sd card. 
     return false; 
    } 
    } 
9

接受的答案不適合我

Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 

工作在情況下,如果設備有內置存儲,則返回true; 我的解決方案是檢查外部文件目錄計數,如果有多個,設備有SD卡。它工作,我測試了幾個設備。

public static boolean hasRealRemovableSdCard(Context context) { 
    return ContextCompat.getExternalFilesDirs(context, null).length >= 2; 
} 
2

您可以檢查外部可移動SD卡,可這樣

public static boolean externalMemoryAvailable(Activity context) { 
    File[] storages = ContextCompat.getExternalFilesDirs(context, null); 
    if (storages.length > 1 && storages[0] != null && storages[1] != null) 
     return true; 
    else 
     return false; 

} 

這工作完全因爲我已經進行了測試。