Um alle verfügbaren Speicherordner (einschließlich SD-Karten) abzurufen, erhalten Sie zunächst die Speicherdateien:
File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
Dann können Sie die verfügbare Größe von jedem von diesen erhalten.
Es gibt drei Möglichkeiten, dies zu tun:
API 8 und niedriger:
StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();
API 9 und höher:
long availableSizeInBytes=file.getFreeSpace();
API 18 und höher (nicht erforderlich, wenn die vorherige in Ordnung ist):
long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes();
Um eine schöne formatierte Zeichenfolge von dem zu erhalten, was Sie jetzt haben, können Sie Folgendes verwenden:
String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);
oder Sie können dies verwenden, wenn Sie die genaue Bytennummer sehen möchten, aber schön:
NumberFormat.getInstance().format(availableSizeInBytes);
Beachten Sie, dass der interne Speicher meines Erachtens mit dem ersten externen Speicher identisch sein kann, da der erste der emulierte ist.
BEARBEITEN: Wenn Sie StorageVolume unter Android Q und höher verwenden, ist es meiner Meinung nach möglich, den freien Speicherplatz von jedem zu nutzen, indem Sie Folgendes verwenden:
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)}")
}
}
Ich bin mir nicht sicher , ob dies richtig ist, und ich kann nicht einen Weg finden , die Gesamtgröße der einzelnen zu bekommen, so dass ich darüber schrieb hier und fragte darüber hier .