Получение полного и доступного пространства на Android

Насколько я знаю, на Android есть:

  • Внутренняя память для приложений и кешей
  • Внутренняя SD-карта на некоторых телефонах (не снимается)
  • Внешняя SD-карта для музыки и фотографий (съемная)

Как получить общее количество и доступное для каждого с проверкой того, что они существуют (некоторые телефоны не имеют внутренней SD-карты)

Спасибо

Ответ 1

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

 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
 }

Ответ 2

/*************************************************************************************************
Returns size in MegaBytes.

If you need calculate external memory, change this: 
    StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
to this: 
    StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
**************************************************************************************************/
    public int TotalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        int Total = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        return Total;
    }

    public int FreeMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        int Free  = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        return Free;
    }

    public int BusyMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        int Total = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        int Free  = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        int Busy  = Total - Free;
        return Busy;
    }

Ответ 3

Для внутренней памяти Environment.getRootDirectory(). GetAbsolutePath() - неправильный подход.

Также на большинстве устройств

Environment.getDataDirectory() работает, но снова не согласован.

Для внешнего подкаталога правильный. Чтобы разграничить использование внутренней mnt/sdcard, используйте

Environment.isExternalStorageRemovable().

Но мне все еще интересно, как получить точную внутреннюю память. Как с непоследовательностью с открытым исходным кодом, так и с большим количеством версий.

Ответ 4

В большинстве телефонов общие блоки представляют собой количество блоков, доступных пользователю (т.е. меньше системного хранилища и т.д.). Мне еще предстоит найти способ, который даст общий объем памяти на телефоне.