在内部存储器上获得可用空间
是否有可能通过Android SDK获得Android设备(而不是SD卡上)的可用内存量?
如果是这样,怎么样?
这个post可能适合你的问题。
也检查这个线程 。 这里有这么多的信息。
谷歌search了一下,这里是解决scheme(在Android GIT中find)
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
类可能是你需要使用的。 我不确定哪个path会被视为设备的根目录,但是我相信无论目录如何,结果都是一样的,只要它是内部存储的一部分即可。 像这样的东西可能会工作:
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获取内部/外部内存的空闲大小这可能有帮助。 在这里,一切都以一个很好的方式解释。