Untuk mendapatkan semua folder penyimpanan yang tersedia (termasuk kartu SD), Anda mendapatkan file penyimpanan terlebih dahulu:
File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
Kemudian Anda bisa mendapatkan ukuran yang tersedia untuk masing-masingnya.
Ada 3 cara untuk melakukannya:
API 8 dan yang lebih lama:
StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();
API 9 ke atas:
long availableSizeInBytes=file.getFreeSpace();
API 18 ke atas (tidak diperlukan jika yang sebelumnya baik-baik saja):
long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes();
Untuk mendapatkan string berformat bagus dari apa yang Anda dapatkan sekarang, Anda dapat menggunakan:
String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);
atau Anda dapat menggunakan ini jika Anda ingin melihat jumlah byte yang tepat tetapi bagus:
NumberFormat.getInstance().format(availableSizeInBytes);
Perhatikan bahwa menurut saya penyimpanan internal bisa sama dengan penyimpanan eksternal pertama, karena yang pertama adalah yang diemulasikan.
EDIT: Menggunakan StorageVolume di Android Q dan di atasnya, saya pikir mungkin untuk mendapatkan ruang kosong masing-masing, menggunakan sesuatu seperti:
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)}")
}
}
Saya tidak yakin apakah ini benar, dan saya tidak dapat menemukan cara untuk mendapatkan ukuran total masing-masing, jadi saya menulis tentang itu di sini , dan menanyakannya di sini .