是否可以通过 Android SDK 获取 Android 设备(而不是 SD 卡)上的可用内存量?
如果是这样,怎么做?
这篇文章可能很适合您的问题。
还要检查这个线程。这里有很多关于 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);
/*************************************************************************************************
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 "???";
}
看起来StatFs
该类可能是您需要使用的。我不确定哪个路径会被视为设备的根目录,但我相信无论目录如何,结果都是相同的,只要它是内部存储的一部分。像这样的东西可能会起作用:
StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;
如果不出意外,StatFs 类应该可以让您在哪里寻找一个良好的开端。
自 2013 年以来,有些方法已被 Google 弃用,您可能会更改这些方法(仅限 API 18+):
getAvailableBlocks()
到getAvailableBlocksLong()
getBlockCount()
到getBlockCountLong()
getBlockSize()
到getBlockSizeLong()
getFreeBlocks()
到getFreeBlocksLong()
在内部存储器大小非常大的设备上,它不起作用,因为 int 值太小。例如在摩托罗拉 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 获取内部/外部内存的可用大小 这可能会有所帮助。在这里,一切都以一种很好的方式进行了解释。