如何findAndroid上剩余的空闲存储空间(磁盘空间)?

我试图找出运行我的应用程序的Android手机上的可用磁盘空间。 有没有办法做到这一点编程?

谢谢,

Solutions Collecting From Web of "如何findAndroid上剩余的空闲存储空间(磁盘空间)?"

试试StatFs.getAvailableBlocks 。 您需要使用getBlockSize将块计数转换为KB。

示例:获取人类可读的大小,如1 Gb

String memory = bytesToHuman(totalMemory())

/************************************************************************************************* 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 = (statFs.getBlockCount() * statFs.getBlockSize()); return total; } public long freeMemory() { StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath()); long free = (statFs.getAvailableBlocks() * statFs.getBlockSize()); return free; } public long busyMemory() { StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath()); long total = (statFs.getBlockCount() * statFs.getBlockSize()); long free = (statFs.getAvailableBlocks() * 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 "???"; } 

根据@ XXX的回答,我已经创build了一个包含StatFs的简单代码片段,以便于使用。 你可以在这里find它作为GitHub的要点 。

关于path的一些细微之处,目前的答案都没有解决。 您必须根据您感兴趣的数据types使用正确的path。基于深入了解DeviceStorageMonitorService.java(在通知区域生成低磁盘空间警告以及ACTION_DEVICE_STORAGE_LOW的粘性广播),以下是一些path你可以使用:

  1. 要检查可用的内部磁盘空间,请使用通过Environment.getDataDirectory()获取的数据目录。 这将为您提供数据分区上的可用空间。 数据分区承载设备上所有应用程序的所有内部存储。

  2. 要检查可用外部(SDCARD)磁盘空间,请使用通过Environment.getExternalStorageDirectory()获取的外部存储目录。 这将为您提供SDCARD上的可用空间。

  3. 要检查包含OS文件的系统分区上的可用内存,请使用Environment.getRootDirectory()。 由于您的应用程序无法访问系统分区,因此此属性可能不是很有用。 DeviceStorageMonitorService用于信息目的并将其input到日志中。

  4. 要检查临时文件/caching内存,请使用Environment.getDownloadCacheDirectory()。 当内存不足时,DeviceStorageMonitorService会尝试清除一些临时文件。

一些用于获取内部(/ data),外部(/ sdcard)和OS(/ system)可用内存的示例代码:

 // Get internal (data partition) free space // This will match what's shown in System Settings > Storage for // Internal Space, when you subtract Total - Used public long getFreeInternalMemory() { return getFreeMemory(Environment.getDataDirectory()); } // Get external (SDCARD) free space public long getFreeExternalMemory() { return getFreeMemory(Environment.getExternalStorageDirectory()); } // Get Android OS (system partition) free space public long getFreeSystemMemory() { return getFreeMemory(Environment.getRootDirectory()); } // Get free space for provided path // Note that this will throw IllegalArgumentException for invalid paths public long getFreeMemory(File path) { StatFs stats = new StatFs(path.getAbsolutePath()); return stats.getAvailableBlocksLong() * stats.getBlockSizeLong(); } 

在进行乘法运算之前,先将您的整数值进行types化。 两个大整数之间的乘法可能会溢出并给出一个负面结果。

 public long sd_card_free(){ File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); int availBlocks = stat.getAvailableBlocks(); int blockSize = stat.getBlockSize(); long free_memory = (long)availBlocks * (long)blockSize; return free_memory; } 

有一点谷歌,你可能已经find了StatFs类是这样的:

Unix statfs()的一个包装器。

提供示例

  • 这里
  • 也在这里 。
  File pathOS = Environment.getRootDirectory();//Os Storage StatFs statOS = new StatFs(pathOS.getPath()); File pathInternal = Environment.getDataDirectory();// Internal Storage StatFs statInternal = new StatFs(pathInternal.getPath()); File pathSdcard = Environment.getExternalStorageDirectory();//External(SD CARD) Storage StatFs statSdcard = new StatFs(pathSdcard.getPath()); if((android.os.Build.VERSION.SDK_INT < 18)) { // Get Android OS (system partition) free space API 18 & Below int totalBlocksOS = statOS.getBlockCount(); int blockSizeOS = statOS.getBlockSize(); int availBlocksOS = statOS.getAvailableBlocks(); long total_OS_memory = (long) totalBlocksOS * (long) blockSizeOS; long free_OS_memory = (long) availBlocksOS * (long) blockSizeOS; long Used_OS_memory = total_OS_memory - free_OS_memory; TotalOsMemory = total_OS_memory ; FreeOsMemory = free_OS_memory; UsedOsMemory = Used_OS_memory; // Get internal (data partition) free space API 18 & Below int totalBlocksInternal = statInternal.getBlockCount(); int blockSizeInternal = statOS.getBlockSize(); int availBlocksInternal = statInternal.getAvailableBlocks(); long total_Internal_memory = (long) totalBlocksInternal * (long) blockSizeInternal; long free_Internal_memory = (long) availBlocksInternal * (long) blockSizeInternal; long Used_Intenal_memory = total_Internal_memory - free_Internal_memory; TotalInternalMemory = total_Internal_memory; FreeInternalMemory = free_Internal_memory ; UsedInternalMemory = Used_Intenal_memory ; // Get external (SDCARD) free space for API 18 & Below int totalBlocksSdcard = statSdcard.getBlockCount(); int blockSizeSdcard = statOS.getBlockSize(); int availBlocksSdcard = statSdcard.getAvailableBlocks(); long total_Sdcard_memory = (long) totalBlocksSdcard * (long) blockSizeSdcard; long free_Sdcard_memory = (long) availBlocksSdcard * (long) blockSizeSdcard; long Used_Sdcard_memory = total_Sdcard_memory - free_Sdcard_memory; TotalSdcardMemory = total_Sdcard_memory; FreeSdcardMemory = free_Sdcard_memory; UsedSdcardMemory = Used_Sdcard_memory; } else { // Get Android OS (system partition) free space for API 18 & Above long total_OS_memory = (statOS. getBlockCountLong() * statOS.getBlockSizeLong()); long free_OS_memory = (statOS. getAvailableBlocksLong() * statOS.getBlockSizeLong()); long Used_OS_memory = total_OS_memory - free_OS_memory; TotalOsMemory = total_OS_memory ; FreeOsMemory = free_OS_memory; UsedOsMemory = Used_OS_memory; // Get internal (data partition) free space for API 18 & Above long total_Internal_memory = (statInternal. getBlockCountLong() * statInternal.getBlockSizeLong()); long free_Internal_memory = (statInternal. getAvailableBlocksLong() * statInternal.getBlockSizeLong()); long Used_Intenal_memory = total_Internal_memory - free_Internal_memory; TotalInternalMemory = total_Internal_memory; FreeInternalMemory = free_Internal_memory ; UsedInternalMemory = Used_Intenal_memory ; // Get external (SDCARD) free space for API 18 & Above long total_Sdcard_memory = (statSdcard. getBlockCountLong() * statSdcard.getBlockSizeLong()); long free_Sdcard_memory = (statSdcard. getAvailableBlocksLong() * statSdcard.getBlockSizeLong()); long Used_Sdcard_memory = tota*emphasized text*l_Sdcard_memory - free_Sdcard_memory; TotalSdcardMemory = total_Sdcard_memory; FreeSdcardMemory = free_Sdcard_memory; UsedSdcardMemory = Used_Sdcard_memory; } } 

由于块大小和getAvailableBlocks

已被弃用

这个代码可以使用

注意根据以上回答user802467

 public long sd_card_free(){ File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long availBlocks = stat.getAvailableBlocksLong(); long blockSize = stat.getBlockSizeLong(); long free_memory = availBlocks * blockSize; return free_memory; } 

我们可以使用getAvailableBlocksLonggetBlockSizeLong

内存位置:

 File[] roots = context.getExternalFilesDirs(null); String path = roots[0].getAbsolutePath(); // PhoneMemory String path = roots[1].getAbsolutePath(); // SCCard (if available) String path = roots[2].getAbsolutePath(); // USB (if available) 

用法

 long totalMemory = StatUtils.totalMemory(path); long freeMemory = StatUtils.freeMemory(path); final String totalSpace = StatUtils.humanize(totalMemory, true); final String usableSpace = StatUtils.humanize(freeMemory, true); 

你可以使用这个

 public final class StatUtils { public static long totalMemory(String path) { StatFs statFs = new StatFs(path); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { //noinspection deprecation return (statFs.getBlockCount() * statFs.getBlockSize()); } else { return (statFs.getBlockCountLong() * statFs.getBlockSizeLong()); } } public static long freeMemory(String path) { StatFs statFs = new StatFs(path); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { //noinspection deprecation return (statFs.getAvailableBlocks() * statFs.getBlockSize()); } else { return (statFs.getAvailableBlocksLong() * statFs.getBlockSizeLong()); } } public static long usedMemory(String path) { long total = totalMemory(path); long free = freeMemory(path); return total - free; } public static String humanize(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); return String.format(Locale.ENGLISH, "%.1f %sB", bytes / Math.pow(unit, exp), pre); } }