在内部存储器上获得可用空间

是否有可能通过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获取内部/外部内存的空闲大小这可能有帮助。 在这里,一切都以一个很好的方式解释。