Получите свободное место на внутренней памяти - PullRequest
39 голосов
/ 04 января 2011

Можно ли получить объем свободной памяти на устройстве Android (не на SD-карте) через Android SDK?

Если да, то как?

Ответы [ 7 ]

64 голосов
/ 04 января 2011

эта запись может хорошо соответствовать вашему вопросу.

также проверьте эту тему . здесь так много информации о SO.

немного погуглил и вот решение (найдено на 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);
24 голосов
/ 12 января 2012
/*************************************************************************************************
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 "???";
    }
9 голосов
/ 04 января 2011

Похоже, вам нужно использовать класс StatFs.Я не уверен, какой путь будет считаться корневым устройством, но я полагаю, что результат будет одинаковым независимо от каталога, если он является частью внутреннего хранилища.Примерно так может работать:

StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;

Если ничего другого, класс StatFs должен дать вам хорошее начало, где искать.

6 голосов
/ 30 марта 2015

Есть несколько методов, которые Google устарела с 2013 года, и вы можете изменить эти методы (только API 18+):

  • getAvailableBlocks() на getAvailableBlocksLong()
  • *От 1008 * до getBlockCountLong()
  • getBlockSize() до getBlockSizeLong()
  • getFreeBlocks() до getFreeBlocksLong()
2 голосов
/ 03 апреля 2012
/**
 * @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;
}
2 голосов
/ 02 августа 2011

На устройствах, где объем внутренней памяти очень большой, он не работает, потому что значение int слишком мало. Например на Motorola xum это не работает. Вы должны использовать что-то вроде этого:

int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes / 1024);

0 голосов
/ 22 февраля 2015

Пожалуйста, обратитесь по этой ссылке: Android получить бесплатный размер внутренней / внешней памяти Это может помочь. Здесь все хорошо объясняется.

...