Как получить размер SD-карты внешнего хранилища (с установленной SD-картой)?

Ссылка: я работал на основе этой ссылки

Я добавил эту строку, чтобы найти размер (внутренний и внешний),

return availableExternalMemorySize/(1024*1024);

Я тестировал в своем планшете. Я получаю как внутреннюю, так и внешнюю SD-карту, как,

Во внутренней памяти:

Общая память - 1007Доступная память --683

Во внешнем хранилище:

Общая память - 1763Доступная память - 1554

Но в планшете я видел настройки. Размер внешнего хранилища составляет 8 ГБ. Но он показывает мне 1,7 ГБ, когда я тестировал через программно.

Какова процедура поиска размера внешнего хранилища?

Ответы на вопрос(4)

Решение Вопроса

 пробел, чтобы показать число, которое согласуется с Меню->Настройки->SD-карта и память телефона 's номер, используйте следующий код:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
double sdAvailSize = (double)stat.getAvailableBlocks()
                   * (double)stat.getBlockSize();
//One binary gigabyte equals 1,073,741,824 bytes.
double gigaAvailable = sdAvailSize / 1073741824;

Вот как вы получаете размеры внутреннего хранилища:

 StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;

Вот как вы можете получить размеры внешнего хранилища (размер SD-карты):

 StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;

Короткая заметка

Бесплатные блоки:

Общее количество свободных блоков в файловой системе, включая зарезервированные блоки (недоступные обычным приложениям).

Доступные блоки:

Количество блоков, которые свободны в файловой системе и доступны для приложений.

Вот как определить, установлена ли SD-карта:

 String state = Environment.getExternalStorageState();
 if (Environment.MEDIA_MOUNTED.equals(state)) 
 {
   // We can read and write the media    
 } 
 else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
 {
    // We can only read the media     
 } 
 else 
 {
    // No external media
 }

Соответствующая документация:http://developer.android.com/reference/android/os/StatFs.html

 Dimitri13 февр. 2014 г., 13:46
интересное объяснение, очень полезно
 msysmilu30 нояб. 2015 г., 16:02
Я пришел сюда какgetAvailableBlocks() устарела. Это не такработать с KitKat и далее. Кажется, эти значения отрицательны, если размер слишком велик. Так что'S предложил использовать.getAvailableBlocksLong()
 IgorGanapolsky01 мар. 2018 г., 18:47
Являетсясвободный размер в мегабайтах или байтах?

ямы сделали эти методы.

public static long sdCardFree_bytes() {
    File   path        = Environment.getExternalStorageDirectory();
    StatFs stat        = new StatFs(path.getPath());
    long   free_memory = 0; //return value is in bytes

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        free_memory = stat.getAvailableBlocksLong() * stat.getBlockSizeLong();
    } else {
        free_memory = stat.getAvailableBlocks() * stat.getBlockSize();
    }

    return free_memory;
}

public static long sdCardUsed_bytes() {

    File   path        = Environment.getExternalStorageDirectory();
    StatFs stat        = new StatFs(path.getPath());
    long   free_memory = 0;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        free_memory = (stat.getBlockCountLong() - stat.getAvailableBlocksLong()) * stat.getBlockSizeLong(); //return value is in bytes
    } else {
        free_memory = (stat.getBlockCount() - stat.getAvailableBlocks()) * stat.getBlockSize(); //return value is in bytes
    }

    return free_memory;
}

public static long sdCardTotal_bytes() {

    File   path        = Environment.getExternalStorageDirectory();
    StatFs stat        = new StatFs(path.getPath());
    long   free_memory = 0;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        free_memory = stat.getBlockCountLong() * stat.getBlockSizeLong(); //return value is in bytes
    } else {
        free_memory = stat.getBlockCount() * stat.getBlockSize(); //return value is in bytes
    }

    return free_memory;
}
 Use the
following code
it may
help

public void getInternalmemorySize() {
    StatFs stat_fs = new StatFs(Environment.getExternalStorageDirectory().getPath());
    double avail_sd_space = (double) stat_fs.getAvailableBlocksLong() * (double) stat_fs.getBlockSizeLong();
    double GB_Available = (avail_sd_space / 1073741824);
    double GBTotal = ((double) stat_fs.getBlockCountLong() * (double) stat_fs.getBlockSizeLong()) / 1073741824;
    SDCardCheck();
    Log.e("Memory", "Available MB  Internal: " + GB_Available + "---" + GBTotal);
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
static String getExternalSdCardSize() {
    File storage = new File("/storage");
    String external_storage_path = "";
    String size = "";

    if (storage.exists()) {
        File[] files = storage.listFiles();

        for (File file : files) {
            if (file.exists()) {
                try {
                    if (Environment.isExternalStorageRemovable(file)) {
                        // storage is removable
                        external_storage_path = file.getAbsolutePath();
                        break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("TAG", e.toString());
                }
            }
        }
    }

    if (!external_storage_path.isEmpty()) {
        File external_storage = new File(external_storage_path);
        if (external_storage.exists()) {
            size = totalSize(external_storage);
        }
    }
    return size;
}

private static String totalSize(File file) {
    StatFs stat = new StatFs(file.getPath());
    long blockSize, totalBlocks;
    long avaiblockSize, availableBlocks;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        blockSize = stat.getBlockSizeLong();
        totalBlocks = stat.getBlockCountLong();
        avaiblockSize = stat.getAvailableBlocksLong();
        availableBlocks = stat.getBlockSizeLong();
    } else {
        blockSize = stat.getBlockSize();
        totalBlocks = stat.getBlockCount();
        avaiblockSize = stat.getAvailableBlocks();
        availableBlocks = stat.getBlockSize();
    }
    Log.e("Memory", "Memory--external--" + (double) (blockSize * totalBlocks) / 1073741824 + "---" + (double) (avaiblockSize * availableBlocks) / 1073741824);
    return formatSize(totalBlocks * blockSize);
}

private static String formatSize(long size) {
    String suffix = null;

    if (size >= 1024) {
        suffix = "KB";
        size /= 1024;
        if (size >= 1024) {
            suffix = "MB";
            size /= 1024;
        }
    }
    size = size / 1024;
    StringBuilder resultBuilder = new StringBuilder(Long.toString(size));

    int commaOffset = resultBuilder.length() - 3;
    while (commaOffset > 0) {
        resultBuilder.insert(commaOffset, ',');
        commaOffset -= 3;
    }

    if (suffix != null)
        resultBuilder.append(suffix);
    return resultBuilder.toString();
}

Ther is
some calculation
behalf of
these Methods.

StructStatVfs[
f_bavail=81523,
f_bfree=81523,
f_blocks=242304,
f_bsize=32768,
f_favail=0,
f_ffree=0,
f_files=0,
f_flag=1038,
f_frsize=32768,
f_fsid=0,
f_namemax=1530
        ]

StructStatVfs[
f_bavail=1633375,
f_bfree=1641567,
f_blocks=3134770,
f_bsize=4096,
f_favail=767939,
f_ffree=767939,
f_files=804672,
f_flag=1038,
f_frsize=4096,
f_fsid=0,
f_namemax=255
        ]


Internal-

        3134770*4096/1024*1024*1024=11.957.10 1633375*4096/1024*1024*1024=6.23

External-
        81523*32768/1024*1024*1024=2.487 242304*32768/1024*1024*1024=7.39

Ты можешь использовать ,getTotalSpace ()getFreeSpace () или жеgetUsableSpace () https://developer.android.com/reference/java/io/File.html

import java.io.File;
import android.util.Log;
....
File f = getMyFile();
Log.d("MyApp", f.getTotalSpace()+"");
....

Ваш ответ на вопрос