Android之獲取手機(jī)內(nèi)部及sdcard存儲(chǔ)空間的方法
知識(shí)點(diǎn):
內(nèi)部存儲(chǔ)空間獲取總大小和可用大??;
sdcard存儲(chǔ)空間獲取總大小和可用大小;
新名詞記錄{StatFs:描述文件系統(tǒng)信息的類}
概覽
在開發(fā)中,我們或多或少都會(huì)用到存儲(chǔ)空間進(jìn)行存儲(chǔ)數(shù)據(jù)。移動(dòng)設(shè)備上可以有兩種的存儲(chǔ)方式:手機(jī)內(nèi)部空間和sdcard外部空間。對(duì)于要使用存儲(chǔ)空間,要使用哪一個(gè)?如何判斷是否有足夠的空間?sdcard是否掛載?等等諸多問題就來了。
對(duì)于設(shè)備內(nèi)部存儲(chǔ)空間來說,是一定會(huì)存在的。如果使用內(nèi)部存儲(chǔ)空間,我們需要做的是判斷內(nèi)部存儲(chǔ)空間是否有足夠大的可用空間給我們使用?,F(xiàn)在的移動(dòng)設(shè)備,手機(jī)廠商已經(jīng)將內(nèi)部存儲(chǔ)做得很大很大了,一般來說用戶都足夠用了。
對(duì)于sdcard,這個(gè)是用戶外部選擇性的進(jìn)行存儲(chǔ)空間擴(kuò)展的,事實(shí)上不一定會(huì)有sdcard。尤其是在現(xiàn)在Android移動(dòng)設(shè)備廠商提供的內(nèi)部存儲(chǔ)空間越來越大,起步的已經(jīng)都是32G了,更大的可以去到128G,所以用戶可能就不需要再進(jìn)行sdcard的擴(kuò)展了。但是,設(shè)備內(nèi)部存儲(chǔ)空間小,需要用到外部存儲(chǔ)空間的情況還是可能會(huì)出現(xiàn)的。而且可以知道主流的APP對(duì)于一些非私密的數(shù)據(jù),例如圖片,歌曲以及下載的更新包等,都會(huì)選擇放置在sdcard里,以減少占用內(nèi)部存儲(chǔ)空間。
說了這么多,我們還是有必要對(duì)上面兩種存儲(chǔ)空間的使用作一個(gè)說明,如何獲取存儲(chǔ)空間是否可用,可用空間是否足夠大等問題。
內(nèi)部存儲(chǔ)空間
我們知道,存儲(chǔ)硬件的空間是按著區(qū)塊來劃分的,每個(gè)區(qū)塊有固定的大小。存儲(chǔ)設(shè)備的總大小=區(qū)塊大小*區(qū)塊數(shù)量。通過StatFs類,我們可以獲取到總的區(qū)塊,可用區(qū)塊和每個(gè)區(qū)塊的字節(jié)大小等信息。
具體看代碼:
/**
* 獲取手機(jī)內(nèi)部空間總大小
*
* @return 大小,字節(jié)為單位
*/
static public long getTotalInternalMemorySize() {
//獲取內(nèi)部存儲(chǔ)根目錄
File path = Environment.getDataDirectory();
//系統(tǒng)的空間描述類
StatFs stat = new StatFs(path.getPath());
//每個(gè)區(qū)塊占字節(jié)數(shù)
long blockSize = stat.getBlockSize();
//區(qū)塊總數(shù)
long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
}
/**
* 獲取手機(jī)內(nèi)部可用空間大小
*
* @return 大小,字節(jié)為單位
*/
static public long getAvailableInternalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
//獲取可用區(qū)塊數(shù)量
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
}
用以上兩個(gè)方法,就可以獲得內(nèi)部存儲(chǔ)空間總大小和可用大小了。
sdcard外部存儲(chǔ)空間
/**
* 判斷SD卡是否可用
*
* @return true : 可用<br>false : 不可用
*/
public static boolean isSDCardEnable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
/**
* 獲取手機(jī)外部總空間大小
*
* @return 總大小,字節(jié)為單位
*/
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);
}
統(tǒng)一描述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;
}
}
總結(jié)
以上就是分別獲取兩個(gè)不同的存儲(chǔ)空間總大小和可用大小的示例。希望對(duì)大家有用。
如有任何問題,請(qǐng)及時(shí)與我聯(lián)系,謝謝!
這篇Android之獲取手機(jī)內(nèi)部及sdcard存儲(chǔ)空間的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)Service或app的方法
這篇文章主要介紹了Android實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)Service或app的方法,結(jié)合實(shí)例形式分析了Android開機(jī)自啟動(dòng)程序的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07
Kotlin擴(kuò)展函數(shù)與運(yùn)算符重載超詳細(xì)解析
Kotlin可以為一個(gè)不能修改的或來自第三方庫中的類編寫一個(gè)新的函數(shù)。這個(gè)新增的函數(shù)就像那個(gè)原始類本來就有的函數(shù)一樣,可以用普通的方法調(diào)用,這種機(jī)制的函數(shù)稱為擴(kuò)展函數(shù)2022-11-11
Android編程實(shí)現(xiàn)通過反射獲取資源Id的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)通過反射獲取資源Id的方法,結(jié)合實(shí)例形式分析了Android反射機(jī)制操作資源的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01
android編程實(shí)現(xiàn)局部界面動(dòng)態(tài)切換的方法
這篇文章主要介紹了android編程實(shí)現(xiàn)局部界面動(dòng)態(tài)切換的方法,以實(shí)例形式較為詳細(xì)的分析了Android局部切換的布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
聊聊GridView實(shí)現(xiàn)拖拽排序及數(shù)據(jù)交互的問題
這篇文章主要介紹了聊聊GridView實(shí)現(xiàn)拖拽排序及數(shù)據(jù)交互的問題,整體實(shí)現(xiàn)思路是通過在一個(gè)容器里放置兩個(gè)dragview,DragView里面進(jìn)行View的動(dòng)態(tài)交換以及數(shù)據(jù)交換,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-11-11
Android實(shí)現(xiàn)自定義手勢(shì)和識(shí)別手勢(shì)的功能
這篇文章主要介紹了Android實(shí)現(xiàn)自定義手勢(shì)和識(shí)別手勢(shì)的功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Android中Activity之間跳轉(zhuǎn)和參數(shù)傳遞的實(shí)例
本篇文章主要介紹了Android中Activity之間跳轉(zhuǎn)和參數(shù)傳遞的實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Android自定義View實(shí)現(xiàn)公交成軌跡圖
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)公交成軌跡圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

