Android開發中經常會遇到多存儲空間的問題,包括內置存儲路徑以及外置SD卡,而且有的時候會有多張外置SD卡,此時就需要獲取不同的SD卡路徑,然后根據需要來寫入或者讀出文件。
此處給出常用的SD卡工具類,用於獲取內外部存儲路徑。
/** * Created by Travis1022 on 2017/8/8. */ public class SdCardUtil { /** * 獲取內置SD卡路徑 * * @return */ public static String getInnerSDCardPath() { return Environment.getExternalStorageDirectory().getPath(); } /** * 獲取存儲路徑 * @return 所有可用於存儲的不同的卡的位置,用一個List來保存 */ public static List<String> getExtSDCardPathList() { List<String> paths = new ArrayList<String>(); String extFileStatus = Environment.getExternalStorageState(); File extFile = Environment.getExternalStorageDirectory(); //首先判斷一下外置SD卡的狀態,處於掛載狀態才能獲取的到 if (extFileStatus.equals(Environment.MEDIA_MOUNTED) && extFile.exists() && extFile.isDirectory() && extFile.canWrite()) { //外置SD卡的路徑 paths.add(extFile.getAbsolutePath()); } try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("mount"); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; int mountPathIndex = 1; while ((line = br.readLine()) != null) { // format of sdcard file system: vfat/fuse if ((!line.contains("fat") && !line.contains("fuse") && !line .contains("storage")) || line.contains("secure") || line.contains("asec") || line.contains("firmware") || line.contains("shell") || line.contains("obb") || line.contains("legacy") || line.contains("data")) { continue; } String[] parts = line.split(" "); int length = parts.length; if (mountPathIndex >= length) { continue; } String mountPath = parts[mountPathIndex]; if (!mountPath.contains("/") || mountPath.contains("data") || mountPath.contains("Data")) { continue; } File mountRoot = new File(mountPath); if (!mountRoot.exists() || !mountRoot.isDirectory() || !mountRoot.canWrite()) { continue; } boolean equalsToPrimarySD = mountPath.equals(extFile .getAbsolutePath()); if (equalsToPrimarySD) { continue; } //擴展存儲卡即TF卡或者SD卡路徑 paths.add(mountPath); } } catch (IOException e) { e.printStackTrace(); } return paths; } }
getInnerSDCardPath()即為直接獲取內部存儲空間的路徑,而對應的getExtSDCardPathList()用於獲取所有的存儲路徑,也包含內部存儲路徑。
效果如下:
對應的日志如下:
E/Logger: [ (SdCardUtil.java:98)#main ] 路徑:/storage/emulated/0
E/Logger: [ (SdCardUtil.java:98)#main ] 路徑:/storage/uicc0
E/Logger: [ (SdCardUtil.java:98)#main ] 路徑:/storage/sdcard1