Android获取手机及外设存储空间
在存儲文件時,為了保證有充足的剩余空間大小,通常需要知道系統(tǒng)內(nèi)部或者sdcard的存儲大小。下面提供一個工具類,記得是從網(wǎng)站搜的。
?
當(dāng)下載或安裝一個文件之前,往往會比較關(guān)心當(dāng)前系統(tǒng)內(nèi)存和SD卡上的剩余容量。
在做文件拷貝,移動操作時,檢測目標目錄的空間大小也是必須的。
?
Android系統(tǒng)提供了Environment?和StatFs兩個類,來實現(xiàn)對容量的檢測。
Environment:
getDataDirectory():?獲取應(yīng)用存儲空間文件對象。
getExternalStorageDirectory():?獲取SD卡文件對象。
getRootDirectory():?獲取系統(tǒng)空間文件對象。
StatFs:?
getBlockCount():?獲取存儲塊數(shù)量。
getAvailableBlocks():?獲取存儲塊數(shù)量。
getBlockSize():?獲取存儲塊大小。
因為Android是基于Linux系統(tǒng)的,所以其沒有盤符的概念,而且是以存儲塊來存儲數(shù)據(jù)。所以獲得容量的正確方式為:
1.?通過Environment獲取需要檢測容量的文件對象。
2.?構(gòu)建StatFs對象。
3.?獲取存儲塊數(shù)量。
4.?獲取存儲塊大小。
5.?計算得出容量大小。
需要注意的是,通過getBlockSize()方法獲取出來的值,是以字節(jié)做單位。
public class TestActivity extends Activity {private String TAG = "Status";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);File data = Environment.getDataDirectory();StatFs sf = new StatFs(data.getPath());int availableBlocks = sf.getAvailableBlocks();Log.d(TAG, "可用存儲塊數(shù)量:" + availableBlocks);int blockCount = sf.getBlockCount();Log.d(TAG, "總存儲塊數(shù)量:" + blockCount);int size = sf.getBlockSize();Log.d(TAG, "存儲塊大小:" + size + "字節(jié)");int totalSize = blockCount * size;Log.d(TAG, "總空間:" + totalSize + "字節(jié)");int availableSize = availableBlocks * size;Log.d(TAG, "可用空間:" + availableSize + "字節(jié)");} }結(jié)果:
SD卡作為手機的擴展存儲設(shè)備,在手機中充當(dāng)硬盤角色,可以讓我們手機存放更多的數(shù)據(jù)以及多媒體等大體積文件。因此查看SD卡的內(nèi)存就跟我們查看硬盤的剩余空間一樣,是我們經(jīng)常操作的一件事,那么在Android開發(fā)中,我們?nèi)绾文塬@取SD卡的內(nèi)存容量呢?
1.要獲取SD卡上面的信息,必須先對SD卡有訪問的權(quán)限,因此第一件事就是需要添加訪問擴展設(shè)備的權(quán)限.
<!-- 在SDCard中創(chuàng)建與刪除文件權(quán)限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard寫入數(shù)據(jù)權(quán)限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />2.需要判斷手機上面SD卡是否插好,如果有SD卡的情況下,我們才可以訪問得到并獲取到它的相關(guān)信息.
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))3.取得sdcard文件路徑
File path = Environment.getExternalStorageDirectory(); StatFs statfs = new StatFs(path.getPath());4.獲取block的SIZE
long blocSize = statfs.getBlockSize();5.獲取BLOCK數(shù)量
long totalBlocks = statfs.getBlockCount();6.空閑的Block的數(shù)量
long availaBlock = statfs.getAvailableBlocks();7.計算總空間大小和空閑的空間大小
public long getAvailaleSize(){File path = Environment.getExternalStorageDirectory(); //取得sdcard文件路徑StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks * blockSize; //(availableBlocks * blockSize)/1024 KIB 單位//(availableBlocks * blockSize)/1024 /1024 MIB單位 }public long getAllSize(){File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getBlockCount(); return availableBlocks * blockSize; }
?
存儲容量檢測?注意構(gòu)建StatFs對象的參數(shù)合法性
LogCat?報錯信息:
02-14?10:24:27.134:?ERROR/(4355):?statfs?nokia?failed,?errno:?2??
02-14?10:24:27.144:?WARN/System.err(4355):?java.lang.IllegalArgumentException??
02-14?10:24:27.153:?WARN/System.err(4355):?at?android.os.StatFs.native_setup(Native?Method)??
02-14?10:24:27.173:?WARN/System.err(4355):?at?android.os.StatFs.(StatFs.java:32)??
02-14?10:24:27.173:?WARN/System.err(4355):?at?com.tmall.util.Devices.getBlock(Devices.java:161)??
02-14?10:24:27.184:?WARN/System.err(4355):?at?com.tmall.util.Devices.getUsedRatio(Devices.java:199)??
02-14?10:24:27.184:?WARN/System.err(4355):?at?com.tmall.nokia.Check.checkSDBlock(Check.java:271)??
02-14?10:24:27.184:?WARN/System.err(4355):?at?com.tmall.nokia.Check.run(Check.java:332)??
02-14?10:24:27.195:?WARN/System.err(4355):?at?java.lang.Thread.run(Thread.java:1019)??
發(fā)生錯誤原因分析:
分析發(fā)生錯誤部分代碼,發(fā)現(xiàn)在構(gòu)建StatFs對象時出錯
nokiaPath?=?"nokia"??
StatFs?sf?=?new?StatFs(nokiaPath);??
StatFs用于對系統(tǒng)的存儲容量進行檢測。報錯是因為構(gòu)建StatFs對象時使用了非法參數(shù)。"nokia"不是一個合法有效的參數(shù),合法參數(shù)應(yīng)該形如"sdcard"。
?
解決辦法:
使用默認的路徑及名稱是最好的方法
nokiaPath?=?Environment.getExternalStorageDirectory().getPath();//?nokiaPath?="/mnt/sdcard"??
//nokiaPath?=?Environment.getExternalStorageDirectory().getName();//?nokiaPath?="sdcard"??
StatFs?sf?=?new?StatFs(nokiaPath);??
如果一定需要自定義路徑作為參數(shù),也應(yīng)使用類似下列格式的有效自定義路徑
nokiaPath?=?"/mnt/sdcard/nokia/";??
nokiaPath?=?"/sdcard/nokia/";??
nokiaPath?=?"sdcard/nokia/";??
?
以合法的路徑及名稱作為參數(shù),一般類似以"/mnt/sdcard"?或"sdcard/"開頭的路徑都是正確的。針對不同硬件,可能需要在編程中通過測試,使用有效格式。
轉(zhuǎn)載于:https://www.cnblogs.com/liyuejiao/p/4257140.html
總結(jié)
以上是生活随笔為你收集整理的Android获取手机及外设存储空间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Azure 中国篇之计算服务—多个站点的
- 下一篇: zookeeper配置