Android 获取内外置存储路径

现在的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);
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值