|
以前的Android(4.1之前的版本)中,SDcard跟路徑通過“/sdcard”或者“/mnt/sdcard”來表示存儲卡,而在Jelly Bean系統中修改為了“/storage/sdcard0”,以後可能還會有多個SDcard的情況。
目前為了保持和之前代碼的兼容,sdcard路徑做了link映射。
為了使您的代碼更加健壯並且能夠兼容以後的Android版 本和新的設備,請通過Environment.getExternalStorageDirect ory().getPath()來獲取sdcard路徑,
如果您需要往sdcard中保存特定類型的內容,可以考慮使用Environment.getExternalStoragePublic Directory(String type)函數,該函數可以返回特定類型的目錄,目前支持如下類型:
DIRECTORY_ALARMS //警報的鈴聲
DIRECTORY_DCIM //相機拍攝的圖片和視頻保存的位置
DIRECTORY_DOWNLOADS //下載文件保存的位置
DIRECTORY_MOVIES //電影保存的位置,比如通過google play下載的電影
DIRECTORY_MUSIC //音樂保存的位置
DIRECTORY_NOTIFICATIONS / /通知音保存的位置
DIRECTORY_PICTURES //下載的圖片保存的位置
DIRECTORY_PODCASTS //用於保存podcast(博客)的音頻文件
DIRECTORY_RINGTONES //保存鈴聲的位置
如果您的應用需要下載以上類型的文件,則可以放到上面對應的目錄中去來幫助用戶查找,比如最常用的就是下載文件了。如果您開發了一個瀏覽器,在下載文件的時候把文件下載到Download目錄則方便用戶以後查找該文件,當然如果你希望用戶需要通過啟動您的程序來查看他們下載的文件,您也可以不這麼做^_^。 在使用這些目錄保存文件的時候,需要注意一點:其他程序也有可能在使用這些目錄,在保存文件前,注意判斷下文件是否已經存在,不要覆蓋了用戶之前的數據。
Android4.1之後Android增加了多存儲卡的支持,一般手機會存在內置存儲卡和外置存儲卡,也可能有多個外置存儲卡。如何獲取存儲卡路徑呢?
特別是各種android設備的存儲器路徑,是不一樣的,比如T卡路徑,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd 或者/mnt/sdcard2。有時內置存儲器的路徑也可能是/mnt/sdcard,而host usb存儲器的路徑也是各種各樣的。
下面方法是通過反射,調用StorageManager的隱藏接口getVolumePaths(),實現獲取存儲器列表。
- package ckl.storage.list;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import android.app.Activity;
- import android.os.storage.StorageManager;
- public class StorageList {
- private Activity mActivity;
- private StorageManager mStorageManager;
- private Method mMethodGetPaths;
- public StorageList(Activity activity) {
- mActivity = activity;
- if (mActivity != null) {
- mStorageManager = (StorageManager)mActivity
- .getSystemService(Activity.STORAGE_SERVICE);
- try {
- mMethodGetPaths = mStorageManager.getClass()
- .getMethod("getVolumePaths");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- }
- }
- }
- public String[] getVolumePaths() {
- String[] paths = null;
- try {
- paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- return paths;
- }
- }
複製代碼
在android2.3中,判斷內置SD卡是否掛載:
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- //為true的話,內置sd卡存在
- }
複製代碼
判斷外置SD卡是否掛載:
順帶描述怎麼取得sdcard的空間大小,
- File sdcardDir = Environment.getExternalStorageDirectory();
- StatFs sf = new StatFs(sdcardDir.getPath()); //sdcardDir.getPath())值为/mnt/sdcard,想取外置sd卡大小的话,直接代入/mnt/sdcard2
- long blockSize = sf.getBlockSize(); //總大小
- long blockCount = sf.getBlockCount();
- long availCount = sf.getAvailableBlocks(); //有效大小
複製代碼
|
|