Android SD卡

一.獲取SDCard路徑

sd卡的路徑能夠經過Environment.getExternalStorageDirectory()來獲取,可是一些高級的手機或者是手持pad都會內置一個sdcard。另外擴展卡上還有一個,使用Environment.getExternalStorageDirectory()這個方法只能夠得到內置的,若是要是把外置路徑給寫死了的話也不行,通過我測試以後不一樣的設備對外置路徑是不同的,好比LG一款mnt/sdcard/_ExternalSD。java

下面有2種方法:數據庫

1.寫一個廣播來監聽sdcard是否拔插來得到外置sdcard路徑

IntentFilter intentFilter = new IntentFilter();// sd卡被插入,且已經掛載
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addDataScheme("file");

    註冊監聽函數
ide

registerReceiver(sdcardRec, intentFilter);// 註冊監聽函數
public class SDcaedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        intent.getData().getPath();//外置設備路徑
    }
}

獲得外置路徑以後將其存儲在數據庫中函數

2.系統角度想到的解決辦法

public String getExterPath() {
    //獲得路徑
    try {
        Runtime runtime = Runtime.getRuntime();
        Process proc = runtime.exec("mount");
        InputStream is = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        String line;
        BufferedReader br = new BufferedReader(isr);
        while ((line = br.readLine()) != null) {
            if (line.contains("secure")) continue;
            if (line.contains("asec")) continue;

            if (line.contains("fat")) {
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    sdcard_path = sdcard_path.concat("*" + columns[1]);
                }
            } else if (line.contains("fuse")) {
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    sdcard_path = sdcard_path.concat(columns[1]);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sdcard_path;
}

若是須要得到外置sd卡中的資源時,最好的解決方案就是把這兩個方法結合起來,插入外置的時候讀取sd卡中的文件,沒有外置設備的時候讀取內置sd卡中的文件。測試


二.一些路徑的標準寫法

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getRootDirectory() = /system
context.getCacheDir() = /data/data/com.mt.mtpp/cache
context.getExternalCacheDir() = /mnt/sdcard/Android/data/com.mt.mtpp/cache
context.getFilesDir() = /data/data/com.mt.mtpp/files


三.判斷雙SD卡,並顯示各個SD卡的剩餘空間

public void getSCardInfo(){
  StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
  try {
	Class<?>[] paramClasses = {};
	Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", paramClasses);
	getVolumePathsMethod.setAccessible(true);
	Object[] params = {};
	Object invoke = getVolumePathsMethod.invoke(storageManager, params);
	for (int i = 0; i < ((String[]) invoke).length; i++) {
	  StatFs stat = getStatFs(((String[]) invoke)[i]);
		
	  Toast.makeText(MainActivity.this,((String[])invoke)[i] + "剩餘空間:" + calculateSizeInMB(stat), Toast.LENGTH_SHORT).show();
	}
  } catch (NoSuchMethodException e1) {
	e1.printStackTrace();
  } catch (IllegalArgumentException e) {
	e.printStackTrace();
  } catch (IllegalAccessException e) {
	e.printStackTrace();
  } catch (InvocationTargetException e) {
	e.printStackTrace();
  }
}
private StatFs getStatFs(String path) {
  try {
	return new StatFs(path);
  } catch (Exception e) {
	e.printStackTrace();
  }
  return null;
}
private float calculateSizeInMB(StatFs stat) {
  if (stat != null)
	return stat.getAvailableBlocks() * (stat.getBlockSize() / (1024f * 1024f));
  return 0.0f;
}
相關文章
相關標籤/搜索