Domanda

Come si fa a controllare se la scheda SD è piena o non così che l'applicazione può decidere se si può continuare a fare il suo lavoro vale a dire di scrittura nella memoria esterna o notificare l'utente che lo stoccaggio ha esaurito lo spazio.

È stato utile?

Soluzione 3

Usa StatFs e passare il percorso della directory di archiviazione esterna al costruttore e si può chiamare funzioni quali getAvailableBlocks() e getBlockSize() sull'oggetto StatFs.

Altri suggerimenti

Attenzione con statfs & int trabocco sui dispositivi più recenti

L'approccio in questa risposta viene rotto su dispositivi con grande immagazzinaggio esterna . Per esempio sul mio Nexus 7, attualmente rendimenti ~ 2 GB, quando in realtà non c'è ~ 10 GB di spazio libero.

// 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 ha metodi di sostituzione di ritorno long, getAvailableBlocksLong() e getBlockCountLong() , ma il problema è che sono stati aggiunti solo in livello API 18 .

Usa questo invece

Il modo più semplice è quello di utilizzare getFreeSpace() in java. io.File , aggiunto nel livello di API 9, che restituisce long:

  

Restituisce il numero di byte liberi sulla partizione che contiene questo   sentiero. Restituisce 0 se questo percorso non esiste.

Quindi, per ottenere spazio libero sulla memoria esterno ( "scheda SD"):

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

In alternativa, se si davvero da utilizzare statfs ma necessità di livello di API supporto <18, questo sarebbe risolvere l'integer overflow:

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;
    }

penso che si può utilizzare questa istruzione a che fare con il vostro problema. questo controllo non posso se non sufficiente capacità di sdcard.

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;
}

Ecco come si ottiene formati di archiviazione interne:

 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;

Ecco come si ottiene la dimensione di memorizzazione esterni (formato scheda SD):

 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top