Можно ли получить объем свободной памяти на устройстве Android (не на SD CARD) через Android SDK?
Если да, то как?
Можно ли получить объем свободной памяти на устройстве Android (не на SD CARD) через Android SDK?
Если да, то как?
это сообщение может хорошо подходить к вашему вопросу.
также проверьте эту тему. здесь так много информации о 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);
/*************************************************************************************************
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 "???";
}
Похоже, что класс StatFs
может быть тем, что вам нужно использовать. Я не уверен, какой путь будет считаться корнем устройства, но я считаю, что результат будет таким же, независимо от каталога, если он является частью внутреннего хранилища. Что-то вроде этого может работать:
StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;
Если ничего другого, класс StatFs должен дать вам хорошее начало, где искать.
Существуют некоторые методы, которые Google устарел от 2013 года, и вы можете изменить эти методы (только API 18+):
getAvailableBlocks()
to getAvailableBlocksLong()
getBlockCount()
to getBlockCountLong()
getBlockSize()
to getBlockSizeLong()
getFreeBlocks()
to getFreeBlocksLong()
На устройствах, где размер внутренней памяти очень большой, он не работает, потому что значение int слишком мало. Например, на Motorola xum это не работает. Вы должны использовать что-то вроде этого:
int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes / 1024);
/**
* @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;
}
Пожалуйста, обратитесь к этой ссылке: Android получит бесплатный размер внутренней/внешней памяти Это может помочь. Здесь все объясняется красиво.