在内存上获得可用空间

cla*_*amp 39 android diskspace

是否可以通过Android SDK获取Android设备(而非SD卡)上的可用内存量?

如果是这样,怎么样?

mad*_*mad 64

这篇文章可能很适合你的问题.

还检查这个帖子.SO上有这么多信息.

google了一下,这里是解决方案(在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);
Run Code Online (Sandbox Code Playgroud)


XXX*_*XXX 24

/*************************************************************************************************
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;
    }
Run Code Online (Sandbox Code Playgroud)

将字节转换为人类可读格式(如1 Mb,1 Gb)

    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 "???";
    }
Run Code Online (Sandbox Code Playgroud)

  • 你实际上需要做(长)statFs.getBlockCount()*(long)statFs.getBlockSize()以确保它们被正确转换. (7认同)
  • 在进行数学运算之前,需要将blockCount和blockSize强制转换为long.否则这些方法可能返回负值,因为块大小的总块数将超过int的最大值.是的,我使用了代码并得到了否定信息. (4认同)

kco*_*ock 9

看起来这个StatFs类可能就是你需要使用的东西.我不确定哪条路径会被视为设备的根目录,但我相信无论目录如何,结果都是相同的,只要它是内部存储的一部分.这样的事情可能有用:

StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;
Run Code Online (Sandbox Code Playgroud)

如果不出意外,StatFs课程应该为您提供一个良好的开端.

  • 凉爽的!我试图为“/”获取它,但没有用。使用“/data”适用于内部存储器。 (2认同)

Ang*_*i H 6

自2013年以来,Google已弃用某些方法,您可能会更改这些方法(仅限API 18+):

  • getAvailableBlocks()getAvailableBlocksLong()
  • getBlockCount()getBlockCountLong()
  • getBlockSize()getBlockSizeLong()
  • getFreeBlocks()getFreeBlocksLong()