Как узнать, сколько свободного места на диске осталось на Android?

Я пытаюсь выяснить доступное дисковое пространство на телефоне Android, на котором работает мое приложение. Есть ли способ сделать это программно?

Благодаря,

Solutions Collecting From Web of "Как узнать, сколько свободного места на диске осталось на Android?"

Попробуйте StatFs.getAvailableBlocks . Вам нужно будет преобразовать количество блоков в КБ с помощью getBlockSize.

Пример: получение читаемого человеком размера, такого как 1 Гб

Строковая память = 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 Мб, 1 Гб)

  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, я создал фрагмент кода gist, который упрощает и упрощает использование StatFs. Вы можете найти его здесь как GitHub .

Есть некоторые тонкости в отношении путей, на которые не отвечает ни один из текущих ответов. Вы должны использовать правильный путь в зависимости от того, какую статистику вы интересуете. Основываясь на глубоком погружении в DeviceStorageMonitorService.java, который генерирует предупреждения о низком диске в области уведомлений и липкие трансляции для ACTION_DEVICE_STORAGE_LOW, вот некоторые из путей Которые вы можете использовать:

  1. Для проверки свободного внутреннего дискового пространства используйте каталог данных, полученный через Environment.getDataDirectory (). Это даст вам свободное место в разделе данных. В разделе данных размещается все внутреннее хранилище для всех приложений на устройстве.

  2. Чтобы проверить свободное внешнее (SDCARD) пространство на диске, используйте внешний каталог хранилища, полученный через Environment.getExternalStorageDirectory (). Это даст вам свободное место на SDCARD.

  3. Чтобы проверить доступную память на системном разделе, который содержит файлы ОС, используйте Environment.getRootDirectory (). Поскольку ваше приложение не имеет доступа к системному разделу, этот stat, вероятно, не очень полезен. DeviceStorageMonitorService использует в информационных целях и вводит его в журнал.

  4. Чтобы проверить временные файлы / кэш-память, используйте Environment.getDownloadCacheDirectory (). DeviceStorageMonitorService пытается очистить некоторые временные файлы, когда память становится низкой.

Некоторые примеры кода для получения внутренней (/ data), внешней (/ sdcard) и ОС (/ системы) свободной памяти:

 // 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(); } 

Typecast ваши целые значения задолго до выполнения умножения. Умножение между двумя большими целыми числами может переполняться и давать отрицательный результат.

 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; } 

С небольшим количеством Google вы могли бы найти класс StatFs который:

[…] a Wrapper для 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; } }