Получите свободное пространство во внутренней памяти
Можно ли получить объем свободной памяти на устройстве Android (не на SD CARD) через Android SDK?
Если да, то как?
Ответы
Ответ 1
это сообщение может хорошо подходить к вашему вопросу.
также проверьте эту тему. здесь так много информации о SO.
googled немного, и вот решение (найдено в android git)
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);
Ответ 2
/*************************************************************************************************
Returns size in bytes.
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 long TotalMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Total = ( (long) statFs.getBlockCount() * (long) statFs.getBlockSize());
return Total;
}
public long FreeMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Free = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
return Free;
}
public long BusyMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Total = ((long) statFs.getBlockCount() * (long) statFs.getBlockSize());
long Free = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
long Busy = Total - Free;
return Busy;
}
Преобразование байтов в формат для чтения человеком (например, 1 Мб, 1 ГБ)
public static String floatForm (double d)
{
return new DecimalFormat("#.##").format(d);
}
public static String bytesToHuman (long size)
{
long Kb = 1 * 1024;
long Mb = Kb * 1024;
long Gb = Mb * 1024;
long Tb = Gb * 1024;
long Pb = Tb * 1024;
long Eb = Pb * 1024;
if (size < Kb) return floatForm( size ) + " byte";
if (size >= Kb && size < Mb) return floatForm((double)size / Kb) + " Kb";
if (size >= Mb && size < Gb) return floatForm((double)size / Mb) + " Mb";
if (size >= Gb && size < Tb) return floatForm((double)size / Gb) + " Gb";
if (size >= Tb && size < Pb) return floatForm((double)size / Tb) + " Tb";
if (size >= Pb && size < Eb) return floatForm((double)size / Pb) + " Pb";
if (size >= Eb) return floatForm((double)size / Eb) + " Eb";
return "???";
}
Ответ 3
Похоже, что класс StatFs
может быть тем, что вам нужно использовать. Я не уверен, какой путь будет считаться корнем устройства, но я считаю, что результат будет таким же, независимо от каталога, если он является частью внутреннего хранилища. Что-то вроде этого может работать:
StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;
Если ничего другого, класс StatFs должен дать вам хорошее начало, где искать.
Ответ 4
Существуют некоторые методы, которые Google устарел от 2013 года, и вы можете изменить эти методы (только API 18+):
-
getAvailableBlocks()
to getAvailableBlocksLong()
-
getBlockCount()
to getBlockCountLong()
-
getBlockSize()
to getBlockSizeLong()
-
getFreeBlocks()
to getFreeBlocksLong()
Ответ 5
На устройствах, где размер внутренней памяти очень большой, он не работает, потому что значение int слишком мало. Например, на Motorola xum это не работает. Вы должны использовать что-то вроде этого:
int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes / 1024);
Ответ 6
/**
* @return Number of bytes available on internal storage
*/
public static long getInternalAvailableSpace() {
long availableSpace = -1L;
try {StatFs stat = new StatFs(Environment.getDataDirectory()
.getPath());
stat.restat(Environment.getDataDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
e.printStackTrace();
}
return availableSpace;
}
Ответ 7
Пожалуйста, обратитесь к этой ссылке: Android получит бесплатный размер внутренней/внешней памяти
Это может помочь. Здесь все объясняется красиво.