Để tải tất cả các thư mục lưu trữ có sẵn (bao gồm cả thẻ SD), trước tiên bạn phải tải các tệp lưu trữ:
File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
Sau đó, bạn có thể nhận được kích thước có sẵn của từng cái đó.
Có 3 cách để làm điều đó:
API 8 trở xuống:
StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();
API 9 trở lên:
long availableSizeInBytes=file.getFreeSpace();
API 18 trở lên (không cần thiết nếu cái trước đó ổn):
long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes();
Để có một chuỗi có định dạng đẹp về những gì bạn có bây giờ, bạn có thể sử dụng:
String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);
hoặc bạn có thể sử dụng điều này trong trường hợp bạn muốn xem số byte chính xác nhưng độc đáo:
NumberFormat.getInstance().format(availableSizeInBytes);
Xin lưu ý rằng tôi nghĩ rằng bộ nhớ trong có thể giống với bộ nhớ ngoài đầu tiên, vì bộ đầu tiên là bộ giả lập.
CHỈNH SỬA: Sử dụng StorageVolume trên Android Q trở lên, tôi nghĩ rằng có thể có được dung lượng trống của mỗi cái, bằng cách sử dụng những thứ như:
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)}")
}
}
Tôi không chắc liệu điều này có chính xác hay không và tôi không thể tìm cách lấy tổng kích thước của từng loại, vì vậy tôi đã viết về nó ở đây và hỏi về nó ở đây .