废话不多说,直接上代码
/**
* @param is_removale true 外置
* false 内置
* 获取外置/内置内存卡的地址
*/
public static String getStoragePath(Context mContext, boolean is_removale) {
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (is_removale == removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
/**
* @param is_removale true 外置
* false 内置
* <p>
* <p>
* 获取剩余内存
*/
public static String readSDCard(boolean is_removale) {
DecimalFormat df = new DecimalFormat("0.00");
if (getStoragePath(UIUtils.getContext(), is_removale) != null) {
StatFs sf = new StatFs(getStoragePath(UIUtils.getContext(), is_removale));
long blockSize;
long blockCount;
long availCount;
if (Build.VERSION.SDK_INT > 18) {
blockSize = sf.getBlockSizeLong();
blockCount = sf.getBlockCountLong();
availCount = sf.getAvailableBlocksLong();
} else {
blockSize = sf.getBlockSize();
blockCount = sf.getBlockCount();
availCount = sf.getAvailableBlocks();
}
LogUtils.i("可用的block数目::" + availCount + ",剩余空间:" + availCount * blockSize / 1073741824 + "GB");
return df.format((double) availCount * (double) blockSize / 1073741824);
}
return "-1";
}
OK啦