2013-02-05 167 views
2

我使用下面的代碼來檢查SD卡是否可用,但是在運行Android 4.x的Samsung Galaxy II和Note設備上,以後操作系統模擬有SD卡,即使在實際上設備上沒有SD卡。正確檢測SD卡是否可用

private boolean isSDCardAvailable() { 
    return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
} 

如果SD卡,可我再調用getExternalCacheDir()得到別人的目錄顯示我這種現象以給用戶和呼叫getCacheDir()使用內部存儲。

上述方法即使沒有SD卡也會返回TRUE和ALL設備。

回答

5

請參閱此方法自API級別11起可用,它可讓您知道內部存儲器是否可用作外部存儲器。在某些設備中,即使SD卡不可用,getExternalStorageDirectory()也會返回true。詳細信息請閱讀下面的文檔。

public static boolean isExternalStorageEmulated() 

在API級別11

返回該設備是否具有被模擬的外部存儲裝置。 如果設置爲true,則設備沒有真實的外部存儲,getExternalStorageDirectory()返回的目錄將使用內部存儲系統的一部分進行分配。

某些系統服務,如包管理器,用它來確定安裝的應用程序。

仿真外部存儲也可能被加密 - 有關更多詳細信息,請參閱setStorageEncryption(android.content.ComponentName,boolean)。

Android docs

+0

我試圖用isExternalStorageEmulated但我的三星Galaxy掌上運行的Android 2.3也效仿SD卡,這種方法不可用API等級10 :( – Lennie

+0

是的,這是真的,我已經寫了這個方法,只有在API 11之後纔可用。使用它時要小心。 – AAnkit

+0

拯救了我的生命。謝謝! – Aerilys

0
boolean mExternalStorageAvailable; 
boolean mExternalStorageWriteable; 

private void checkExternalMedia() { 
    mExternalStorageAvailable = false; 
    mExternalStorageWriteable = false; 
    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; 
    } 
}