簡體   English   中英

如何獲取Android中已安裝SD卡的實際大小?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM