package com.konka.music.util; import java.io.File; import android.os.Build; import android.os.Environment; import android.os.StatFs; import com.konka.music.wedget.MusicApplication; import com.kubeiwu.baseclass.util.KLog; /** * @author wangxu * @description 判断是否有內外置sd卡,并获取各自路径 (根目录不限于 /mnt 、 /storage) * */ public class SDCardUtil { private static SDCardUtil mSdCardUtil = null; private String mExternalPath = ""; private String mInternalPath = ""; private boolean mHasExternalSD = false; private boolean mHasInternalSD = false; /** * 是否有外置sd卡 * */ private void checkSDcard() { String externalSDPath = Environment.getExternalStorageDirectory().toString(); String anotherPath = ""; String root = externalSDPath.split("/")[1]; File file = new File("/"+root); File storages[] = file.listFiles(); int count = 0; for(File tmp: storages) { if(tmp.toString().contains("sdcard") && tmp.length() > 0) { count++; if(!tmp.toString().equals(externalSDPath)) { anotherPath = tmp.toString(); } } } if(count > 1) { if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { //android 4.0 及以下 // if(externalSDPath.contains("mnt")) { mExternalPath = externalSDPath; mInternalPath = anotherPath; }else { mExternalPath = anotherPath; mInternalPath = externalSDPath; } mHasExternalSD = true; mHasInternalSD = true; } else if(count==1) { mExternalPath = ""; mHasExternalSD = false; mInternalPath = externalSDPath; mHasInternalSD = true; } KLog.v("wangxu", "SDCardUtil->checkSDcard->SD卡="+mExternalPath + ", 手机存储=" + mInternalPath); } private SDCardUtil() { checkSDcard(); } public static SDCardUtil getInstance() { if(mSdCardUtil == null) mSdCardUtil = new SDCardUtil(); return mSdCardUtil; } /** * 是否有内置sd卡 * */ public boolean hasInternalSD() { return mHasInternalSD; } public boolean hasExternalSD() { return mHasExternalSD; } /** * 获取内置sd卡路径 * */ public String getInternalSDPath() { return mInternalPath; } /** * 获取外置sd卡路径 * */ public String getExternalSDPath() { return mExternalPath; } /** * 返回当前sd卡路径 * */ public String getCurrentSDPath() { //检测到2个sd卡 if(hasExternalSD()) { return MyPreference.getPref("download_path", getInternalSDPath()); }else { return getInternalSDPath(); } } /** * 获取某个目录的容量情况, * @param rootSDPath sd卡根目录 * @param cachePath 本地缓存目录 * */ public CapacityUtil getCapacity(String rootSDPath, String cachePath) { try { // FileSize getFilesize = new FileSize(); FileUtils fileUtil = new FileUtils(); StatFs statFs = new StatFs(new File(rootSDPath).getPath()); double blockSize = statFs.getBlockSize(); // Block的size double blockCount = statFs.getBlockCount(); // 总Block数量 double availableBlocks = statFs.getAvailableBlocks(); // 可用的Block数量 CapacityUtil capacityUtil = new CapacityUtil(); capacityUtil.totalSize = blockCount * blockSize; capacityUtil.avaliableSize = availableBlocks * blockSize; capacityUtil.movieSize = fileUtil.get_size(cachePath); //本地缓存目录容量 capacityUtil.otherSize = (blockCount-availableBlocks) * blockSize; //包含本地缓存 // KLog.i("wangxu", "SwitchCachePath->getCapacity->" + capacityUtil); return capacityUtil; }catch(Exception e) { e.printStackTrace(); } return new CapacityUtil(); } /** * 获取当前选中sd的本地缓存容量 * */ public CapacityUtil getCapacity(String rootSDPath) { return getCapacity(rootSDPath, ((MusicApplication)MusicApplication.getAppContext()).getDownloadMusicPath()); } public class CapacityUtil{ public double totalSize = 0; public double movieSize = 0; public double otherSize = 0; public double avaliableSize = 0; public CapacityUtil() {} @Override public String toString() { return "容量:" + totalSize + ", 本地缓存:" + movieSize + ", 其他:" + otherSize + ", 剩余:" + avaliableSize; } } }