Получение всего общего и доступного пространства на Android - PullRequest
12 голосов
/ 26 января 2011

Насколько мне известно, на Android есть:

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

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

Спасибо

Ответы [ 5 ]

32 голосов
/ 26 января 2011

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

 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
 }
3 голосов
/ 19 декабря 2012

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

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

Environment.getDataDirectory () работает, но опять-таки не соответствует.

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

Environment.isExternalStorageRemovable ().

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

3 голосов
/ 12 января 2012
/*************************************************************************************************
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;
    }
0 голосов
/ 02 апреля 2018

StatFs - получение общей информации о пространстве в файловой системе.Это оболочка для Unix statvfs ().

На уровне API 18 используйте

long getTotalBytes - The total number of bytes supported by the file system. 

Для более старых версий API

int getBlockCount ()
int getBlockSize ()

StatFs stat = new StatFs(**path**);
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();

Здесь необходимо указать правильное строковое значениедля переменной пути.Вам необходимо использовать строковые значения пути, например: "/ mnt / external_sd /" "/ mnt / extSdCard /"

Вы можете получить список всех устройств / mnt / и использовать одно изэто значения.

File mntDir = new File("/mnt/");
if(mntDir.isDirectory()){ 
String[] dirList = mntDir.list();...}

или что-то вроде

var file=new Java.IO.File("storage/");
var listOfStorages=file.ListFiles();

или

String[] externals = System.getenv("SECONDARY_STORAGE").split(":");
0 голосов
/ 23 октября 2017

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

...