41

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

如果是这样,怎么做?

4

7 回答 7

64

这篇文章可能很适合您的问题。

还要检查这个线程。这里有很多关于 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);
于 2011-01-04T15:41:21.517 回答
25
/*************************************************************************************************
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 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 "???";
    }
于 2012-01-11T20:58:53.377 回答
10

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

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

如果不出意外,StatFs 类应该可以让您在哪里寻找一个良好的开端。

于 2011-01-04T15:52:42.207 回答
7

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

  • getAvailableBlocks()getAvailableBlocksLong()
  • getBlockCount()getBlockCountLong()
  • getBlockSize()getBlockSizeLong()
  • getFreeBlocks()getFreeBlocksLong()
于 2015-03-30T03:17:41.420 回答
2

在内部存储器大小非常大的设备上,它不起作用,因为 int 值太小。例如在摩托罗拉 xum 上它不起作用。你必须使用这样的东西:

int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes / 1024);

于 2011-08-02T13:51:56.863 回答
2
/**
 * @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;
}
于 2012-04-03T05:34:49.887 回答
0

请参考此链接:Android 获取内部/外部内存的可用大小 这可能会有所帮助。在这里,一切都以一种很好的方式进行了解释。

于 2015-02-22T13:45:26.170 回答