2013-05-30 11 views
9

Link :I worked on based on this LinkCome ottenere una dimensione della scheda sd della memoria esterna (con scheda SD montata)?

ho aggiunto questa linea per trovare le dimensioni (sia interna che esterna) dimensioni,

return availableExternalMemorySize/(1024*1024); 

ho provato nel mio Tablet. Io sono sempre sia interna e la dimensione esterna scheda SD come,

nella memoria interna:

  1. Memoria totale --1007
  2. Disponibile memoria --683

In Storage esterno:

  1. Total Memory - 1763
  2. Av memoria ailabile - 1554

Ma in Tablet, ho visto le impostazioni. Una dimensione di archiviazione esterna ha 8 GB. Ma mi sta mostrando 1,7 GB in giro quando ho provato via programmaticamente.

Qual è la procedura per trovare una dimensione di archiviazione esterna?

risposta

13

Per ottenere risultati a disposizione lo spazio "libero" della scheda SD esterna per mostrare un numero che è d'accordo con la Menu-> Impostazioni-> scheda SD e il numero di memoria del telefono, utilizzare il seguente codice:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
double sdAvailSize = (double)stat.getAvailableBlocks() 
        * (double)stat.getBlockSize(); 
//One binary gigabyte equals 1,073,741,824 bytes. 
double gigaAvailable = sdAvailSize/1073741824; 

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 dimensioni esterne di memorizzazione (SD di dimensioni carta):

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; 

Breve nota

blocchi gratis:

Il numero totale di blocchi che sono libero sul file system, tra cui blocchi riservati (che non sono disponibili per le applicazioni normali) .

blocchi disponibili:

Il numero di blocchi che sono liberi sul file system e disponibile per applicazioni.


Ecco come rilevare se la scheda SD è montato:

String state = Environment.getExternalStorageState(); 
if (Environment.MEDIA_MOUNTED.equals(state)) 
{ 
    // We can read and write the media  
} 
else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
{ 
    // We can only read the media  
} 
else 
{ 
    // No external media 
} 

documentazione pertinente: http://developer.android.com/reference/android/os/StatFs.html

+0

interessante spiegazione, molto utile – Dimitri

+2

Sono venuto qui come 'getAvailableBlocks()' è deprecato. Non funziona da KitKat in poi. Sembra che questi valori siano negativi se la dimensione è troppo grande. Quindi, si suggerisce di usare 'getAvailableBlocksLong()'. – msysmilu

+0

È ** freeSize ** in MB o byte? –

0

Al fine di tenere conto della deprecazione e cross-disponibilità, ho fatto questi metodi.

public static long sdCardFree_bytes() { 
    File path  = Environment.getExternalStorageDirectory(); 
    StatFs stat  = new StatFs(path.getPath()); 
    long free_memory = 0; //return value is in bytes 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     free_memory = stat.getAvailableBlocksLong() * stat.getBlockSizeLong(); 
    } else { 
     free_memory = stat.getAvailableBlocks() * stat.getBlockSize(); 
    } 

    return free_memory; 
} 

public static long sdCardUsed_bytes() { 

    File path  = Environment.getExternalStorageDirectory(); 
    StatFs stat  = new StatFs(path.getPath()); 
    long free_memory = 0; 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     free_memory = (stat.getBlockCountLong() - stat.getAvailableBlocksLong()) * stat.getBlockSizeLong(); //return value is in bytes 
    } else { 
     free_memory = (stat.getBlockCount() - stat.getAvailableBlocks()) * stat.getBlockSize(); //return value is in bytes 
    } 

    return free_memory; 
} 

public static long sdCardTotal_bytes() { 

    File path  = Environment.getExternalStorageDirectory(); 
    StatFs stat  = new StatFs(path.getPath()); 
    long free_memory = 0; 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     free_memory = stat.getBlockCountLong() * stat.getBlockSizeLong(); //return value is in bytes 
    } else { 
     free_memory = stat.getBlockCount() * stat.getBlockSize(); //return value is in bytes 
    } 

    return free_memory; 
} 
Problemi correlati