package com.androidex.utils; import android.annotation.TargetApi; import android.os.Build; import android.os.Environment; import android.os.StatFs; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * SDCard 帮助类 */ public class SDCardUtil { private static final String TAG = SDCardUtil.class.getSimpleName(); private SDCardUtil() { /** cannot be instantiated **/ throw new UnsupportedOperationException("cannot be instantiated"); } public static File getSdcardDir() { File dir = Environment.getExternalStorageDirectory(); if (!dir.exists()) { dir.mkdirs(); } return dir; } public static File getCameraDir() { File cameraDir = new File(getSdcardDir(), "/" + Environment.DIRECTORY_DCIM + "/Camera"); if (!cameraDir.exists()) { cameraDir.mkdirs(); } return cameraDir; } /** * 判断SDCard是否可用 * * @return */ public static boolean isSDCardEnable() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED) && !Environment.getExternalStorageState().equals(Environment.MEDIA_SHARED); } /** * 获取SD卡路径 * * @return */ public static String getSDCardPath() { return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator; } /** * 获取SD卡的剩余容量 单位byte * * @return */ public static long getSDCardAllSize() { if (isSDCardEnable()) { StatFs stat = new StatFs(getSDCardPath()); // 获取空闲的数据块的数量 long availableBlocks = (long) stat.getAvailableBlocks() - 4; // 获取单个数据块的大小(byte) long freeBlocks = stat.getAvailableBlocks(); return freeBlocks * availableBlocks; } return 0; } /** * 获取指定路径所在空间的剩余可用容量字节数,单位byte * * @param filePath * @return 容量字节 SDCard可用空间,内部存储可用空间 */ public static long getFreeBytes(String filePath) { // 如果是sd卡的下的路径,则获取sd卡可用容量 if (filePath.startsWith(getSDCardPath())) { filePath = getSDCardPath(); } else {// 如果是内部存储的路径,则获取内存存储的可用容量 filePath = Environment.getDataDirectory().getAbsolutePath(); } StatFs stat = new StatFs(filePath); long availableBlocks = (long) stat.getAvailableBlocks() - 4; return stat.getBlockSize() * availableBlocks; } /** * 获取系统存储路径 * * @return */ public static String getRootDirectoryPath() { return Environment.getRootDirectory().getAbsolutePath(); } /** * 获取sd(外置)卡路径 */ public static String getOpenSDCardPath() { String cmd = "cat /proc/mounts"; Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象 BufferedReader bufferedReader = null; try { Process p = run.exec(cmd);// 启动另一个进程来执行命令 bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(p.getInputStream()))); String lineStr; while ((lineStr = bufferedReader.readLine()) != null) { LogA.i(TAG, "proc/mounts: " + lineStr); if (lineStr.contains("sdcard") && lineStr.contains(".android_secure")) { String[] strArray = lineStr.split(" "); if (strArray.length >= 5) { String sdcard = strArray[1].replace("/.android_secure", ""); //return sdcard; } } if (p.waitFor() != 0 && p.exitValue() == 1) { // p.exitValue()==0表示正常结束,1:非正常结束 LogA.e(TAG, cmd + " 命令执行失败"); } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException e) { e.printStackTrace(); } } return Environment.getExternalStorageDirectory().getPath(); } /** * 查看所有的sd路径 */ public static String getSDCardPathEx() { String mount = ""; 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) { LogA.i(TAG, "mount: " + line); if (line.contains("secure")) { continue; } if (line.contains("asec")) { continue; } if (line.contains("fat")) { String columns[] = line.split(" "); if (columns.length > 1) { mount = mount.concat("*" + columns[1] + "\n"); } } else if (line.contains("fuse")) { String columns[] = line.split(" "); if (columns.length > 1) { mount = mount.concat(columns[1] + "\n"); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return mount; } /** * 获取当前路径,可用空间 * * @param path * @return */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public static long getAvailableSize(String path) { try { File base = new File(path); StatFs stat = new StatFs(base.getPath()); return stat.getBlockSizeLong() * ((long) stat.getAvailableBlocksLong()); } catch (Exception e) { e.printStackTrace(); } return 0; } /** * 获取 SD card 信息 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public static SDCardInfo getSDCardInfo() { SDCardInfo sd = new SDCardInfo(); String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { sd.isExist = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { File sdcardDir = Environment.getExternalStorageDirectory(); StatFs sf = new StatFs(sdcardDir.getPath()); sd.totalBlocks = sf.getBlockCountLong(); sd.blockByteSize = sf.getBlockSizeLong(); sd.availableBlocks = sf.getAvailableBlocksLong(); sd.availableBytes = sf.getAvailableBytes(); sd.freeBlocks = sf.getFreeBlocksLong(); sd.freeBytes = sf.getFreeBytes(); sd.totalBytes = sf.getTotalBytes(); } } if (LogA.isDebug()) { LogA.i(TAG, sd.toString()); } return sd; } /** * see more {@link android.os.StatFs} */ public static class SDCardInfo { public boolean isExist; public long totalBlocks; public long freeBlocks; public long availableBlocks; public long blockByteSize; public long totalBytes; public long freeBytes; public long availableBytes; @Override public String toString() { return "SDCardInfo{" + "isExist=" + isExist + ", totalBlocks=" + totalBlocks + ", freeBlocks=" + freeBlocks + ", availableBlocks=" + availableBlocks + ", blockByteSize=" + blockByteSize + ", totalBytes=" + totalBytes + ", freeBytes=" + freeBytes + ", availableBytes=" + availableBytes + '}'; } } }