Подтвердить что ты не робот

Получите свободное пространство во внутренней памяти

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

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

4b9b3361

Ответ 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;
}