Wie kann ich den verfügbaren Speicherplatz auf einem Android-Gerät überprüfen? Auf einer SD-Karte? [duplicate]

Lesezeit: 6 Minuten

Benutzeravatar von Zeus
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);
}

Der obige Code bezieht sich auf einige seit dem 13. August 2014 veraltete Funktionen. Ich reproduziere unten eine aktualisierte Version:

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

Benutzeravatar von Yaroslav Boichuk
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);

Erläuterung

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

Benutzeravatar von Muhammad Nabeel Arif
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

Benutzeravatar von Ilya Gazman
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

Benutzeravatar von Peter Mortensen
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

Benutzeravatar von Joop
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.

1438970cookie-checkWie kann ich den verfügbaren Speicherplatz auf einem Android-Gerät überprüfen? Auf einer SD-Karte? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy