sd卡的路徑能夠經過Environment.getExternalStorageDirectory()來獲取,可是一些高級的手機或者是手持pad都會內置一個sdcard。另外擴展卡上還有一個,使用Environment.getExternalStorageDirectory()這個方法只能夠得到內置的,若是要是把外置路徑給寫死了的話也不行,通過我測試以後不一樣的設備對外置路徑是不同的,好比LG一款mnt/sdcard/_ExternalSD。java
下面有2種方法:數據庫
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();//外置設備路徑 } }
獲得外置路徑以後將其存儲在數據庫中函數
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
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; }