Android之獲取手機內部及sdcard存儲空間

Android之獲取手機內部及sdcard存儲空間

文章鏈接

知識點:

  1. 內部存儲空間獲取總大小和可用大小;
  2. sdcard存儲空間獲取總大小和可用大小;
  3. 新名詞記錄{StatFs:描述文件系統信息的類}

概覽

在開發中,我們或多或少都會用到存儲空間進行存儲數據。移動設備上可以有兩種的存儲方式:手機內部空間和sdcard外部空間。對於要使用存儲空間,要使用哪一個?如何判斷是否有足夠的空間?sdcard是否掛載?等等諸多問題就來了。

對於設備內部存儲空間來說,是一定會存在的。如果使用內部存儲空間,我們需要做的是判斷內部存儲空間是否有足夠大的可用空間給我們使用。現在的移動設備,手機廠商已經將內部存儲做得很大很大了,一般來說用戶都足夠用了。

對於sdcard,這個是用戶外部選擇性的進行存儲空間擴展的,事實上不一定會有sdcard。尤其是在現在Android移動設備廠商提供的內部存儲空間越來越大,起步的已經都是32G了,更大的可以去到128G,所以用戶可能就不需要再進行sdcard的擴展了。但是,設備內部存儲空間小,需要用到外部存儲空間的情況還是可能會出現的。而且可以知道主流的APP對於一些非私密的數據,例如圖片,歌曲以及下載的更新包等,都會選擇放置在sdcard裏,以減少佔用內部存儲空間。

說了這麼多,我們還是有必要對上面兩種存儲空間的使用作一個說明,如何獲取存儲空間是否可用,可用空間是否足夠大等問題。


內部存儲空間

我們知道,存儲硬件的空間是按着區塊來劃分的,每個區塊有固定的大小。存儲設備的總大小=區塊大小*區塊數量。通過StatFs類,我們可以獲取到總的區塊,可用區塊和每個區塊的字節大小等信息。

具體看代碼:

/**
     * 獲取手機內部空間總大小
     *
     * @return 大小,字節爲單位
     */
    static public long getTotalInternalMemorySize() {
        //獲取內部存儲根目錄
        File path = Environment.getDataDirectory();
        //系統的空間描述類
        StatFs stat = new StatFs(path.getPath());
        //每個區塊佔字節數
        long blockSize = stat.getBlockSize();
        //區塊總數
        long totalBlocks = stat.getBlockCount();
        return totalBlocks * blockSize;
    }

    /**
     * 獲取手機內部可用空間大小
     *
     * @return 大小,字節爲單位
     */
    static public long getAvailableInternalMemorySize() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        //獲取可用區塊數量
        long availableBlocks = stat.getAvailableBlocks();
        return availableBlocks * blockSize;
    }

用以上兩個方法,就可以獲得內部存儲空間總大小和可用大小了。


sdcard外部存儲空間

    /**
     * 判斷SD卡是否可用
     *
     * @return true : 可用<br>false : 不可用
     */
    public static boolean isSDCardEnable() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }

/**
     * 獲取手機外部總空間大小
     *
     * @return 總大小,字節爲單位
     */
    static public long getTotalExternalMemorySize() {
        if (isSDCardEnable()) {
            //獲取SDCard根目錄
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());
            long blockSize = stat.getBlockSize();
            long totalBlocks = stat.getBlockCount();
            return totalBlocks * blockSize;
        } else {
            return -1;
        }
    }

    /**
     * 獲取SD卡剩餘空間
     *
     * @return SD卡剩餘空間
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String getFreeSpace() {
        if (!isSDCardEnable()) return "sdcard unable!";
        StatFs stat = new StatFs(getSDCardPath());
        long blockSize, availableBlocks;
        availableBlocks = stat.getAvailableBlocksLong();
        blockSize = stat.getBlockSizeLong();
        long size = availableBlocks * blockSize / 1024L;
        return String.valueOf(size);
    }

統一描述sdcard的信息

/**
     * 獲取SD卡信息
     *
     * @return SDCardInfo
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String getSDCardInfo() {
        SDCardInfo sd = new SDCardInfo();
        if (!isSDCardEnable()) return "sdcard unable!";
        sd.isExist = true;
        StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath());
        sd.totalBlocks = sf.getBlockCountLong();
        sd.blockByteSize = sf.getBlockSizeLong();
        sd.availableBlocks = sf.getAvailableBlocksLong();
        sd.availableBytes = sf.getAvailableBytes();
        sd.freeBlocks = sf.getFreeBlocksLong();
        sd.freeBytes = sf.getFreeBytes();
        sd.totalBytes = sf.getTotalBytes();
        return sd.toString();
    }

    public static class SDCardInfo {
        boolean isExist;
        long totalBlocks;
        long freeBlocks;
        long availableBlocks;
        long blockByteSize;
        long totalBytes;
        long freeBytes;
        long availableBytes;

        @Override
        public String toString() {
            return "isExist=" + isExist +
                    "\ntotalBlocks=" + totalBlocks +
                    "\nfreeBlocks=" + freeBlocks +
                    "\navailableBlocks=" + availableBlocks +
                    "\nblockByteSize=" + blockByteSize +
                    "\ntotalBytes=" + totalBytes +
                    "\nfreeBytes=" + freeBytes +
                    "\navailableBytes=" + availableBytes;
        }
    }

總結

以上就是分別獲取兩個不同的存儲空間總大小和可用大小的示例。希望對大家有用。

如有任何問題,請及時與我聯繫,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章