Получение полного и доступного пространства на 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
В большинстве телефонов общие блоки представляют собой количество блоков, доступных пользователю (т.е. меньше системного хранилища и т.д.). Мне еще предстоит найти способ, который даст общий объем памяти на телефоне.