Frage

Wie überprüfen Sie, ob die SD-Karte voll ist oder nicht, so dass Ihre Anwendung entscheiden kann, ob er auch weiterhin seine Aufgabe heißt Schreib auf externe Speicher tun oder den Benutzer benachrichtigen, dass die Lagerung von Raum abgelaufen ist.

War es hilfreich?

Lösung 3

Mit StatFs und übergeben Sie den Pfad des externen Speicherverzeichnis an den Konstruktor und Sie können Funktionen aufrufen wie getAvailableBlocks() und getBlockSize() auf dem StatFs Objekt.

Andere Tipps

Watch out mit statfs & int Überlauf auf neueren Geräten

Der Ansatz in dieser Antwort auf Geräte mit großem externem Speicher defekt ist . Zum Beispiel auf meinem Nexus 7, das zur Zeit kehrt ~ 2 GB, wenn es in Wirklichkeit gibt es ~ 10 GB Speicherplatz links.

// DOES NOT WORK CORRECTLY ON DEVICES WITH LARGE STORAGE DUE TO INT OVERFLOW
File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDirectory.getAbsolutePath());  
int free = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1024 / 1024;

statfs hat Ersatzmethoden long Rückkehr getAvailableBlocksLong() und getBlockCountLong() , aber das Problem ist, dass sie nur in hinzugefügt wurden API-Ebene 18 .

verwenden stattdessen

einfachste Weg ist, zu verwenden, getFreeSpace() in Java. io.File , hinzugefügt in API-Ebene 9, die long zurückgibt:

Gibt die Anzahl der freien Bytes auf der Partition mit diesem Pfad. Gibt 0 zurück, wenn dieser Pfad nicht existiert.

Also, um den freien Speicherplatz auf dem externen Speicher ( "SD-Karte") zu erhalten:

File externalStorageDir = Environment.getExternalStorageDirectory();
long free = externalStorageDir.getFreeSpace() / 1024 / 1024;

Alternativ, wenn Sie wirklich wollen statfs verwenden, aber Notwendigkeit, Unterstützung API-Ebene <18, würde dies den Integerüberlauf beheben:

File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDir.getAbsolutePath());  
long blocks = statFs.getAvailableBlocks();
long free = (blocks * statFs.getBlockSize()) / 1024 / 1024;
/******************************************************************************************
Returns size in MegaBytes.

If you need calculate external memory, change this: 
   StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
to this: 
   StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());

******************************************************************************************/
    public long totalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   total  = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        return total;
    }

    public long freeMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        long   free   = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        return free;
    }

    public long busyMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   total  = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        long   free   = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        long   busy   = total - free;
        return busy;
    }

Ich glaube, Sie diese Anweisung verwenden, können mit Ihrem Problem zu tun. dies kann nicht prüfen, ob oder nicht genügend Kapazität von SD-Karte.

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
    //to do something in here
}
/**
 * @return Number of bytes available on external storage
 */
public static long getExternalStorageAvailableSpace() {
    long availableSpace = -1L;
    try {
        StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
                .getPath());
        stat.restat(Environment.getExternalStorageDirectory().getPath());
        availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return availableSpace;
}

Hier ist, wie Sie interne Speichergrößen erhalten:

 StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;

Hier ist, wie Sie externe Speichergrößen (SD-Format) erhalten:

 StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top