Чтобы получить все доступные папки хранения (включая SD-карты), вы сначала получаете файлы хранения:
File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
Затем вы можете получить доступный размер каждой из них.
ТамЕсть 3 способа сделать это:
API 8 и ниже:
StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();
API 9 и выше:
long availableSizeInBytes=file.getFreeSpace();
API 18 и выше (не требуется, если предыдущийвсе в порядке):
long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes();
Чтобы получить красивую отформатированную строку из того, что вы получили сейчас, вы можете использовать:
String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);
или вы можете использовать ее, если хотите увидетьточное число байтов, но приятно:
NumberFormat.getInstance().format(availableSizeInBytes);
Обратите внимание, что я думаю, что внутреннее хранилище может быть таким же, как первое внешнее хранилище, так как первое - эмулируемое.* РЕДАКТИРОВАТЬ: Используя StorageVolume на Android Q и выше, я думаю, что можно получить свободное место каждого, используя что-то вроде:
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageVolumes = storageManager.storageVolumes
AsyncTask.execute {
for (storageVolume in storageVolumes) {
val uuid: UUID = storageVolume.uuid?.let { UUID.fromString(it) } ?: StorageManager.UUID_DEFAULT
val allocatableBytes = storageManager.getAllocatableBytes(uuid)
Log.d("AppLog", "allocatableBytes:${android.text.format.Formatter.formatShortFileSize(this,allocatableBytes)}")
}
}
Я не уверен, что это правильно, и я могу 'Не могу найти общий размер каждого из них, поэтому я написал об этом здесь и спросил об этом здесь .