现在的Android手机的ROM都比较大,所以会分割出去一部分空间作为内部存储,但是由于空间大小已经超过了32G了,所以在 存储路径上命名不是简单的 sdcard和sdcard1
查找了一些资料,利用反射的方法去获取内外置储存空间的实际路径,代码如下:
@NonNull
public static List<String> getStorageDirectory(Context context) {
List<String> list = new ArrayList<>();
try {
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
Method getVolumePathsMethod = StorageManager.class.getDeclaredMethod("getVolumePaths");
getVolumePathsMethod.setAccessible(true);
String[] paths = (String[]) getVolumePathsMethod.invoke(storageManager);
if (paths != null && paths.length > 0) {
Collections.addAll(list, paths);
} else {
Log.w(TAG, "getStorageDirectory: not found");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return list;
}
以上为获取存储路径的代码,如果插有SD卡,也能获取到SD卡挂载的路径,另外附上计算存储空间大小的代码:
private static final int K = 1024;
private static final int M = 1024 * 1024;
private static final int G = 1024 * 1024 * 1024;
public String getStorageInformation(Context context) {
StringBuilder builder = new StringBuilder();
List<String> list = StorageUtils.getStorageDirectory(context);
if (!list.isEmpty()) {
for (String s : list) {
builder.append("StorageDirectory:").append(s).append("\n");
StatFs statFs = new StatFs(s);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
builder.append("Available:").append(getSize(statFs.getBlockSizeLong() * statFs.getAvailableBlocksLong())).append("\n");
builder.append("Total:").append(getSize(statFs.getBlockSizeLong() * statFs.getBlockCountLong())).append("\n");
} else {
builder.append("Available:").append(getSize(statFs.getBlockSize() * statFs.getAvailableBlocks())).append("\n");
builder.append("Total:").append(getSize(statFs.getBlockSize() * statFs.getBlockCount())).append("\n");
}
}
builder.append("DefaultDirectory:").append(Environment.getExternalStorageDirectory().getAbsolutePath());
}
return builder.toString();
}
private String getSize(long bytes) {
if (bytes < K) {
return String.format(Locale.CHINA, "%.2f B", bytes * 1.0f);
} else if (bytes < M) {
return String.format(Locale.CHINA, "%.2f KB", bytes * 1.0f / K);
} else if (bytes < G) {
return String.format(Locale.CHINA, "%.2f MB", bytes * 1.0f / M);
} else {
return String.format(Locale.CHINA, "%.2f GB", bytes * 1.0f / G);
}
}