[英]How to get actual size of mounted SD card in Android?
從SOF和Android開發人員網站上的研究中,我試圖找到一種方法來查找手機上已安裝SD卡的總大小和可用空間,但我能夠找到方法getExternalStorageDirectory(),但根據Android API會返回一個不一定位於外部的目錄:
“傳統上,這是SD卡,但它也可以實現為設備中的內置存儲,該設備不同於受保護的內部存儲,可以作為文件系統安裝在計算機上。”
因此,我從“外部存儲”目錄實際上可以是多個物理存儲設備(內部和外部存儲器)中分離出來的方式收集信息。 從我的測試中可以發現,使用此方法返回的大小約為實際SD卡大小的1.5倍。
所以我的問題是,有沒有一種編程的方法可以返回SD卡上的總大小和可用空間? 手機本身可以給我提供這些信息,所以我覺得應該有辦法,但是我現在茫然了……任何幫助將不勝感激!
編輯:這是我目前用於總大小的代碼
private long TotalSDMemory(){
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getAbsolutePath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long totalSpace = totalBlocks * blockSize;
Log.d(TAG,"Size of total SD Memory: "+totalSpace);
Log.d(TAG, "External storage emulated: "+Environment.isExternalStorageEmulated());
return totalSpace;
}
Edit(2):我不知道這很重要,但是我有一個三星Galaxy S3,這就是我用來測試代碼的東西,顯然三星的外部存儲器具有不同的文件結構。 這是一個應該可以幫助其他人獲得正確大小的鏈接: 獲得三星手機中SD卡的大小
public String[] getSize() throws IOException {
String memory="";
Process p = Runtime.getRuntime().exec("df /mnt/sdcard");
InputStream is =p.getInputStream();
int by=-1;
while((by=is.read())!=-1) {
memory+=new String(new byte[]{(byte)by});
}
for (String df:memory.split("/n")) {
if(df.startsWith("/mnt/sdcard")) {
String[] par = df.split(" ");
List<String> pp=new ArrayList<String>();
for(String pa:par) {
if(!pa.isEmpty()) {
pp.add(pa);
}
}
return pp.toArray(new String[pp.size()]);
}
}
return null;
}
getSize()[0]是/ mnt / sdcard。 getSize()[1]是sd的大小(示例12.0G),使用了getSize()[2],[3]是空閑的,[4]是blksize
要么:
new File("/sdcard/").getFreeSpace() - bytes of free in long
new File("/sdcard/").getTotalSpace() - size of sd
是的,有辦法。
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long sdAvailSize = (long)stat.getAvailableBlocks()
* (long)stat.getBlockSize();
//One binary gigabyte equals 1,073,741,824 bytes.
long gigaAvailable = sdAvailSize / 1073741824;
從這里得到的信息: 如何檢查安裝在Android設備上的SD卡有多少可用空間?
關於您關於獲取總大小的問題,請看這里: 獲取Android上的所有總空間和可用空間
編輯:
Marcelo Filho指出,API 18(KitKat)中不贊成使用此方法。
Google建議改用getAvailableBlocksLong ()
和getBlockCountLong ()
。 兩種方法都將返回一個long值,而不是 double值。
暗示:
Kikiwa指出,應將這些數據類型long(現在不推薦使用)與這些方法一起使用,否則,如果文件大小太大,則可能會得到負值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.