Wie überprüfe ich, wie viel Speicherplatz (in MB oder GB) auf dem Android-Gerät verbleibt? Ich verwende Java und Android SDK 2.0.1.
Gibt es einen Systemdienst, der so etwas aufdecken würde?
Zeus
Wie überprüfe ich, wie viel Speicherplatz (in MB oder GB) auf dem Android-Gerät verbleibt? Ich verwende Java und Android SDK 2.0.1.
Gibt es einen Systemdienst, der so etwas aufdecken würde?
Yaroslavs Antwort gibt die Größe der SD-Karte an, nicht den verfügbaren Speicherplatz. StatFs getAvailableBlocks()
gibt die Anzahl der Blöcke zurück, auf die normale Programme noch zugreifen können. Hier ist die Funktion, die ich verwende:
public static float megabytesAvailable(File f) {
StatFs stat = new StatFs(f.getPath());
long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();
return bytesAvailable / (1024.f * 1024.f);
}
public static float megabytesAvailable(File f) {
StatFs stat = new StatFs(f.getPath());
long bytesAvailable = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)
bytesAvailable = (long) stat.getBlockSizeLong() * (long) stat.getAvailableBlocksLong();
else
bytesAvailable = (long) stat.getBlockSize() * (long) stat.getAvailableBlocks();
return bytesAvailable / (1024.f * 1024.f);
}
Ja, getBlockSize() ist veraltet. Wir könnten auch Environment.getDataDirectory().getUsableSpace() verwenden, um den verfügbaren freien Speicherplatz abzurufen.
– nous
10. Dezember 2014 um 0:48 Uhr
Jaroslaw Boichuk
Versuchen dieser Code:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs: " + megAvailable);
getBlockCount()
– Rückgabegröße der SD-Karte;
getAvailableBlocks()
– gibt die Anzahl der Blöcke zurück, die noch für normale Programme zugänglich sind (danke Joe)
Wie Joe Wreschning sagt, findet dies die SD-Kartengröße
– Kurru
19. Juni 2011 um 15:13 Uhr
siehe die Antwort unten von Joe.
– chiranjib
9. April 2012 um 6:54 Uhr
wird “megAvailable” die Datengröße der SD-Karte oder freien Speicherplatz auf der SD-Karte haben?
– codeMan
24. Juli 2013 um 11:04 Uhr
getBlockSize
und getBlockCount
sind jetzt veraltet. Verwenden stat.getBlockSizeLong() * stat.getBlockCountLong()
stattdessen.
– Okramotte
8. September 2014 um 12:05 Uhr
Der einzige Teil dieses Codes, der jetzt nicht veraltet ist, ist System.out.println
– SR
6. Juli 2019 um 4:12 Uhr
Muhammad Nabel Arif
Ich habe einige gebrauchsfertige Funktionen entworfen, um den verfügbaren Platz in verschiedenen Einheiten zu erhalten. Sie können diese Methoden verwenden, indem Sie einfach eine davon in Ihr Projekt kopieren.
/**
* @return Number of bytes available on External storage
*/
public static long getAvailableSpaceInBytes() {
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace;
}
/**
* @return Number of kilo bytes available on External storage
*/
public static long getAvailableSpaceInKB() {
final long SIZE_KB = 1024L;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_KB;
}
/**
* @return Number of Mega bytes available on External storage
*/
public static long getAvailableSpaceInMB() {
final long SIZE_KB = 1024L;
final long SIZE_MB = SIZE_KB * SIZE_KB;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_MB;
}
/**
* @return Number of gega bytes available on External storage
*/
public static long getAvailableSpaceInGB() {
final long SIZE_KB = 1024L;
final long SIZE_GB = SIZE_KB * SIZE_KB * SIZE_KB;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_GB;
}
vielen Dank für so ein schönes Codebeispiel, es funktioniert wie am Schnürchen 🙂
– SwiftBoy
10. Dezember 2012 um 7:43 Uhr
Finden Sie, dass es zu viele Wiederholungen gibt. Guter Code, aber er kann viel kleiner gemacht werden.
– Raigex
14. August 2013 um 16:42 Uhr
@Raigex nein, er kann nicht sagen, dass Sie einzelne Teile kopieren können, sodass Sie nur einen davon verwenden können.
– Joopp
10. Juni 2015 um 6:58 Uhr
Irgendwelche Subs für veraltete Methoden?
– Ralph Gabb
5. September 2019 um 5:18 Uhr
Ilja Gazman
Basierend auf dieser Antwort haben sie Unterstützung für die Android-Version < 18 hinzugefügt:
public static float megabytesAvailable(File file) {
StatFs stat = new StatFs(file.getPath());
long bytesAvailable;
if(Build.VERSION.SDK_INT >= 18) {
bytesAvailable = getAvailableBytes(stat);
}
else {
// noinspection deprecation
bytesAvailable = stat.getBlockSize() * stat.getAvailableBlocks();
}
return bytesAvailable / (1024.f * 1024.f);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private static long getAvailableBytes(StatFs stat) {
return stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
}
Seit der API-Version 18 wurden neue Methoden eingeführt.
Ich habe so etwas für die Schätzung der Größe des großen Festplattencaches verwendet (für den Picasso OkHttp-Downloader-Cache). Die Hilfsmethode war so:
private static final String BIG_CACHE_PATH = "my-cache-dir";
private static final float MAX_AVAILABLE_SPACE_USE_FRACTION = 0.9f;
private static final float MAX_TOTAL_SPACE_USE_FRACTION = 0.25f;
static File createDefaultCacheDirExample(Context context) {
File cache = new File(context.getApplicationContext().getCacheDir(), BIG_CACHE_PATH);
if (!cache.exists()) {
cache.mkdirs();
}
return cache;
}
/**
* Calculates minimum of available or total fraction of disk space
*
* @param dir
* @return space in bytes
*/
@SuppressLint("NewApi")
static long calculateAvailableCacheSize(File dir) {
long size = 0;
try {
StatFs statFs = new StatFs(dir.getAbsolutePath());
int sdkInt = Build.VERSION.SDK_INT;
long totalBytes;
long availableBytes;
if (sdkInt < Build.VERSION_CODES.JELLY_BEAN_MR2) {
int blockSize = statFs.getBlockSize();
availableBytes = ((long) statFs.getAvailableBlocks()) * blockSize;
totalBytes = ((long) statFs.getBlockCount()) * blockSize;
} else {
availableBytes = statFs.getAvailableBytes();
totalBytes = statFs.getTotalBytes();
}
// Target at least 90% of available or 25% of total space
size = (long) Math.min(availableBytes * MAX_AVAILABLE_SPACE_USE_FRACTION, totalBytes * MAX_TOTAL_SPACE_USE_FRACTION);
} catch (IllegalArgumentException ignored) {
// ignored
}
return size;
}
Um in MB umzurechnen, sollten Sie um 1048576 (Bytes in MB-Zählung) tauchen.
– fada21
14. April 2014 um 14:22 Uhr
Peter Mortensen
Wenn Sie den verfügbaren Speicherplatz im internen Speicher überprüfen möchten, verwenden Sie außerdem:
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
…
Um in MB umzurechnen, sollten Sie um 1048576 (Bytes in MB-Zählung) tauchen.
– fada21
14. April 2014 um 14:22 Uhr
Joop
Google hat Informationen dazu auf der Seite “Erste Schritte”. – Siehe Freien Speicherplatz abfragen. Sie sagen, dass Sie entweder den verfügbaren Platz überprüfen können getFreeSpace()
Sie geben jedoch an, dass dies ungenau ist und Sie mit etwas weniger freiem Speicherplatz rechnen sollten. Sie sagen:
Wenn die zurückgegebene Zahl einige MB größer ist als die Größe der Daten, die Sie speichern möchten, oder wenn das Dateisystem zu weniger als 90 % voll ist, können Sie wahrscheinlich sicher fortfahren. Andernfalls sollten Sie wahrscheinlich nicht in den Speicher schreiben.
Außerdem geben sie den Rat, dass es oft sinnvoller ist, den freien Speicherplatz gar nicht erst zu prüfen try
catch
für einen Fehler:
Sie müssen den verfügbaren Speicherplatz nicht überprüfen, bevor Sie Ihre Datei speichern. Sie können stattdessen versuchen, die Datei sofort zu schreiben und dann eine IOException abfangen, wenn eine auftritt. Möglicherweise müssen Sie dies tun, wenn Sie nicht genau wissen, wie viel Speicherplatz Sie benötigen. Wenn Sie beispielsweise die Codierung der Datei ändern, bevor Sie sie speichern, indem Sie ein PNG-Bild in JPEG konvertieren, kennen Sie die Größe der Datei vorher nicht.
Ich würde empfehlen, dass Sie nur bei sehr großen Dateigrößen den verfügbaren Speicherplatz vorher überprüfen, damit Sie keine Zeit mit dem Herunterladen oder Erstellen einer Datei verlieren, die offensichtlich zu groß ist, um sie zu speichern. In beiden Fällen sollten Sie immer verwenden try
catch
Daher denke ich, dass das einzige Argument dafür ist, den verfügbaren freien Speicherplatz vorher zu überprüfen, wenn entweder der unnötige Ressourcenverbrauch und die Zeit zu viel sind.