Android 存储卡相关辅助类 StorageUtils

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jdfkldjlkjdl/article/details/82906993

功能描述

主要包含了内部存储卡和外部存储卡的一些通用方法。

工具代码

package com.xzy.util;

import android.annotation.TargetApi;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;

import java.io.File;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Locale;

/**
 * 存储相关.
 *
 * @author xzy
 */
@SuppressWarnings({"unused", "WeakerAccess"})
public class StorageUtils {

    private static final String TAG = "StorageUtils";

    private StorageUtils() {
    }

    /**
     * 判断外部主存储是否可写.
     *
     * @return true - 可写,false - 不可写
     */
    public static boolean isExternalPrimaryStorageWritable() {
        String state;
        try {
            state = Environment.getExternalStorageState();
        } catch (NullPointerException exception) {
            state = "";
        }
        return Environment.MEDIA_MOUNTED.equals(state);
    }

    /**
     * 判断外部主存储是否可读.
     *
     * @return true - 可读,false - 不可读
     */
    public static boolean isExternalPrimaryStorageReadable() {
        String state;
        try {
            state = Environment.getExternalStorageState();
        } catch (NullPointerException exception) {
            state = "";
        }
        return Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
    }

    /**
     * 获取外部挂载的次存储路径,例如 sdcard.
     *
     * @return 次存储路径,没有挂载时返回空字符串
     */
    public static String getExternalSecondaryStorage() {
        final HashSet<String> out = new HashSet<>();
        String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
        StringBuilder sb = new StringBuilder();
        try {
            final Process process = new ProcessBuilder()
                    .command("mount")
                    .redirectErrorStream(true)
                    .start();
            process.waitFor();
            final InputStream is = process.getInputStream();
            final byte[] buffer = new byte[1024];
            while (is.read(buffer) != -1) {
                sb.append(new String(buffer));
            }
            is.close();
        } catch (final Exception e) {
            Log.e(TAG, "获取外部挂载的次存储失败", e);
        }

        // parse output
        final String[] lines = sb.toString().split("\n");
        for (String line : lines) {
            if (!line.toLowerCase(Locale.US).contains("asec")) {
                if (line.matches(reg)) {
                    String[] parts = line.split(" ");
                    for (String part : parts) {
                        if (part.startsWith("/")) {
                            if (!part.toLowerCase(Locale.US).contains("vold")) {
                                out.add(part);
                            }
                        }
                    }
                }
            }
        }
        return out.iterator().hasNext() ? out.iterator().next() : "";
    }

    /**
     * 判断外部次存储是否可用.
     *
     * @return rue - 可用,false - 不可用
     */
    public static boolean isExternalSecondaryStorageAvailable() {
        return FileUtils.isExist(getExternalSecondaryStorage());
    }

    /**
     * 获取外部次存储的总大小,单位:MB.
     *
     * @return 外部次存储空间的总大小
     */
    public static int getExternalSecondaryStorageTotalSize() {
        String path = getExternalSecondaryStorage();
        if (TextUtils.isEmpty(path)) {
            return 0;
        }
        StatFs stat = new StatFs(path);

        long blockSize = getBlockSizeJellyBeanMr2(stat);
        long totalBlocks = getBlockCountJellyBeanMr2(stat);
        return (int) ((totalBlocks * blockSize) / (1024 * 1024));
    }

    /**
     * 获取外部次存储的可用大小,单位:MB.
     *
     * @return 外部次存储空间的可用大小
     */
    public static int getExternalSecondaryStorageAvailableSize() {
        String path = getExternalSecondaryStorage();
        if (TextUtils.isEmpty(path)) {
            return 0;
        }
        StatFs stat = new StatFs(path);
        long blockSize = getBlockSizeJellyBeanMr2(stat);
        long totalBlocks = getAvailableBlocksJellyBeanMr2(stat);
        return (int) ((totalBlocks * blockSize) / (1024 * 1024));
    }

    /**
     * 获取外部主存储的总大小,单位:MB.
     *
     * @return 外部存储空间的总大小
     */
    public static int getExternalPrimaryStorageTotalSize() {
        if (isExternalPrimaryStorageWritable()) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());

            long blockSize = getBlockSizeJellyBeanMr2(stat);
            long totalBlocks = getBlockCountJellyBeanMr2(stat);
            return (int) ((totalBlocks * blockSize) / (1024 * 1024));
        }
        return 0;
    }

    /**
     * 获取外部主存储的可用大小,单位:MB.
     *
     * @return 外部存储空间的可用大小
     */
    public static int getExternalPrimaryStorageAvailableSize() {
        if (isExternalPrimaryStorageWritable()) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());

            long blockSize = getBlockSizeJellyBeanMr2(stat);
            long totalBlocks = getAvailableBlocksJellyBeanMr2(stat);
            return (int) ((totalBlocks * blockSize) / (1024 * 1024));
        }
        return 0;
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    private static long getBlockSizeJellyBeanMr2(@NonNull StatFs stat) {
        return stat.getBlockSizeLong();
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    private static long getBlockCountJellyBeanMr2(@NonNull StatFs stat) {
        return stat.getBlockCountLong();
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    private static long getAvailableBlocksJellyBeanMr2(@NonNull StatFs stat) {
        return stat.getAvailableBlocksLong();
    }
}

猜你喜欢

转载自blog.csdn.net/jdfkldjlkjdl/article/details/82906993