Ich möchte die Größe des freien Speichers im internen / externen Speicher meines Geräts programmgesteuert ermitteln. Ich benutze diesen Code:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);
File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format = Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);
und das Ergebnis, das ich bekomme, ist:
11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB
Das Problem ist, dass ich den freien Speicher von SdCard bekommen möchte, der gerade ist 1,96GB
. Wie kann ich diesen Code reparieren, um die freie Größe zu erhalten?
android
android-sdcard
diskspace
Android-Droid
quelle
quelle
Antworten:
Unten ist der Code für Ihren Zweck:
RAM-Größe abrufen
quelle
getBlockSize()
undgetBlockCount
sind veraltet.So habe ich es gemacht:
quelle
getBlockSize
undgetAvailableBlocks
mitgetBlockSizeLong
undgetAvailableBlocksLong
.Seit API 9 können Sie Folgendes tun:
quelle
File.getUsableSpace()
scheint eine einfachere Methode zu sein, als sie zu verwendenStatFs
. Warum sollte ichStatFs
@MarkCarter verwenden?Um alle verfügbaren Speicherordner (einschließlich SD-Karten) abzurufen, erhalten Sie zunächst die Speicherdateien:
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:
API 9 und höher:
API 18 und höher (nicht erforderlich, wenn die vorherige in Ordnung ist):
Um eine schöne formatierte Zeichenfolge von dem zu erhalten, was Sie jetzt haben, können Sie Folgendes verwenden:
oder Sie können dies verwenden, wenn Sie die genaue Bytennummer sehen möchten, aber schön:
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:
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 .
quelle
@ Android-Droid - Sie sind falsche
Environment.getExternalStorageDirectory()
Punkte auf externen Speicher, der keine SD-Karte sein muss, es kann auch ein Mount des internen Speichers sein. Sehen:Suchen Sie einen externen Speicherort für die SD-Karte
quelle
Probieren Sie dieses einfache Snippet aus
quelle
java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648
Fehler, scheint dasdigitGroups
Ergebnis -2147483648 zu sein.Es ist sehr einfach, den verfügbaren Speicher zu ermitteln, wenn Sie sowohl einen internen als auch einen externen Speicherpfad erhalten. Auch der externe Speicherpfad des Telefons ist wirklich sehr einfach herauszufinden
Ich konzentriere mich also nur darauf, wie man die Pfade des externen Wechselspeichers wie Wechseldatenträger, USB OTG (nicht getestetes USB OTG, da ich kein USB OTG habe) herausfindet.
Die folgende Methode enthält eine Liste aller möglichen externen Wechselspeicherpfade.
quelle
Schnelle Ergänzung zum Thema Externer Speicher
Lassen Sie sich nicht durch den Methodennamen
externalMemoryAvailable()
in Dinesh Prajapatis Antwort verwirren .Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
Gibt den aktuellen Status des Speichers an, wenn das Medium vorhanden ist und an seinem Einhängepunkt mit Lese- / Schreibzugriff bereitgestellt wird. Sie werdentrue
sogar auf Geräten ohne SD-Karten wie Nexus 5 arbeiten. Dennoch ist es eine "Must-Have" -Methode, bevor Operationen mit Speicher ausgeführt werden.Um zu überprüfen, ob sich auf Ihrem Gerät eine SD-Karte befindet, können Sie die Methode verwenden
ContextCompat.getExternalFilesDirs()
Es werden keine vorübergehenden Geräte wie USB-Sticks angezeigt.
Beachten Sie auch, dass
ContextCompat.getExternalFilesDirs()
unter Android 4.3 und niedriger immer nur 1 Eintrag zurückgegeben wird (SD-Karte, falls verfügbar, andernfalls intern). Sie können mehr darüber lesen Sie hier .In meinem Fall war es genug, aber vergessen Sie nicht, dass einige der Android-Geräte möglicherweise 2 SD-Karten haben. Wenn Sie also alle benötigen, passen Sie den obigen Code an.
quelle
In der StorageStatsManager-Klasse wurde Android O und höher eingeführt, mit dem Sie kostenloses und vollständiges Byte im externen / internen Speicher erhalten. Ausführliche Informationen zum Quellcode finden Sie in meinem folgenden Artikel. Sie können Reflection für weniger als Android O verwenden
https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b
quelle
So habe ich es gemacht ..
interner Gesamtspeicher
Interne freie Größe
Externer freier und Gesamtspeicher
quelle
In Bezug auf die äußere Menory gibt es einen anderen Weg:
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();
quelle
Nachdem ich verschiedene Lösungen überprüft habe, schreibe ich selbst Code. Dies ist der vollständige Code zum Finden
'' ''
quelle