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.InputStreamReader;
public final class SDCardUtils {
private SDCardUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 判断SD卡是否可用
*
* @return true : 可用<br>false : 不可用
*/
public static boolean isSDCardEnable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
/**
* 获取SD卡路径
* <p>先用shell,shell失败再普通方法获取,一般是/storage/emulated/0/</p>
*
* @return SD卡路径
*/
public static String getSDCardPath() {
if (!isSDCardEnable()) return null;
String cmd = "cat /proc/mounts";
Runtime run = Runtime.getRuntime();
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) {
if (lineStr.contains("sdcard") && lineStr.contains(".android_secure")) {
String[] strArray = lineStr.split(" ");
if (strArray.length >= 5) {
return strArray[1].replace("/.android_secure", "") + File.separator;
}
}
if (p.waitFor() != 0 && p.exitValue() == 1) {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseUtils.closeIO(bufferedReader);
}
return Environment.getExternalStorageDirectory().getPath() + File.separator;
}
/**
* 获取SD卡data路径
*
* @return SD卡data路径
*/
public static String getDataPath() {
if (!isSDCardEnable()) return null;
return Environment.getExternalStorageDirectory().getPath() + File.separator + "data" + File.separator;
}
/**
* 获取SD卡剩余空间
*
* @return SD卡剩余空间
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getFreeSpace() {
if (!isSDCardEnable()) return null;
StatFs stat = new StatFs(getSDCardPath());
long blockSize, availableBlocks;
availableBlocks = stat.getAvailableBlocksLong();
blockSize = stat.getBlockSizeLong();
return ConvertUtils.byte2FitMemorySize(availableBlocks * blockSize);
}
/**
* 获取SD卡信息
*
* @return SDCardInfo
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getSDCardInfo() {
if (!isSDCardEnable()) return null;
SDCardInfo sd = new SDCardInfo();
sd.isExist = true;
StatFs sf = new StatFs(Environment.getExternalStorageDirectory().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();
return sd.toString();
}
public static class SDCardInfo {
boolean isExist;
long totalBlocks;
long freeBlocks;
long availableBlocks;
long blockByteSize;
long totalBytes;
long freeBytes;
long availableBytes;
@Override
public String toString() {
return "isExist=" + isExist +
"\ntotalBlocks=" + totalBlocks +
"\nfreeBlocks=" + freeBlocks +
"\navailableBlocks=" + availableBlocks +
"\nblockByteSize=" + blockByteSize +
"\ntotalBytes=" + totalBytes +
"\nfreeBytes=" + freeBytes +
"\navailableBytes=" + availableBytes;
}
}
}
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.InputStreamReader;
public final class SDCardUtils {
private SDCardUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 判断SD卡是否可用
*
* @return true : 可用<br>false : 不可用
*/
public static boolean isSDCardEnable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
/**
* 获取SD卡路径
* <p>先用shell,shell失败再普通方法获取,一般是/storage/emulated/0/</p>
*
* @return SD卡路径
*/
public static String getSDCardPath() {
if (!isSDCardEnable()) return null;
String cmd = "cat /proc/mounts";
Runtime run = Runtime.getRuntime();
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) {
if (lineStr.contains("sdcard") && lineStr.contains(".android_secure")) {
String[] strArray = lineStr.split(" ");
if (strArray.length >= 5) {
return strArray[1].replace("/.android_secure", "") + File.separator;
}
}
if (p.waitFor() != 0 && p.exitValue() == 1) {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseUtils.closeIO(bufferedReader);
}
return Environment.getExternalStorageDirectory().getPath() + File.separator;
}
/**
* 获取SD卡data路径
*
* @return SD卡data路径
*/
public static String getDataPath() {
if (!isSDCardEnable()) return null;
return Environment.getExternalStorageDirectory().getPath() + File.separator + "data" + File.separator;
}
/**
* 获取SD卡剩余空间
*
* @return SD卡剩余空间
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getFreeSpace() {
if (!isSDCardEnable()) return null;
StatFs stat = new StatFs(getSDCardPath());
long blockSize, availableBlocks;
availableBlocks = stat.getAvailableBlocksLong();
blockSize = stat.getBlockSizeLong();
return ConvertUtils.byte2FitMemorySize(availableBlocks * blockSize);
}
/**
* 获取SD卡信息
*
* @return SDCardInfo
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getSDCardInfo() {
if (!isSDCardEnable()) return null;
SDCardInfo sd = new SDCardInfo();
sd.isExist = true;
StatFs sf = new StatFs(Environment.getExternalStorageDirectory().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();
return sd.toString();
}
public static class SDCardInfo {
boolean isExist;
long totalBlocks;
long freeBlocks;
long availableBlocks;
long blockByteSize;
long totalBytes;
long freeBytes;
long availableBytes;
@Override
public String toString() {
return "isExist=" + isExist +
"\ntotalBlocks=" + totalBlocks +
"\nfreeBlocks=" + freeBlocks +
"\navailableBlocks=" + availableBlocks +
"\nblockByteSize=" + blockByteSize +
"\ntotalBytes=" + totalBytes +
"\nfreeBytes=" + freeBytes +
"\navailableBytes=" + availableBytes;
}
}
}