2011-01-25 14 views
11

Que yo sepa, en Android, hay:conseguir todo el espacio total y disponible en Android

  • de memoria interna para aplicaciones y caché
  • tarjeta SD interna en algunos teléfonos (no extraíble)
  • Tarjeta SD externa para música y fotos (extraíble)

¿Cómo consigo la total y disponible para cada uno con un cheque que existen (algunos teléfonos no tienen una tarjeta SD interna)

Gracias

Respuesta

32

Así es como se obtiene tamaños de almacenamiento interno:

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; 

Así es como se obtiene tamaños de almacenamiento externo (tamaño de tarjeta 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; 

corto nota

Bloques libres:

El número total de bloques que son libre en el sistema de archivos, incluyendo bloques reservados (que no están disponibles para las aplicaciones normales).

bloques disponibles:

El número de bloques que están libres de el sistema de archivos y aplicaciones disponibles a .


Aquí es cómo detectar si está montada la tarjeta SD:.

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 
} 
+0

¡gran respuesta! cualquier forma de obtener el tamaño de la tarjeta SD interna, no de la memoria flash integrada? y ¿cuál es la diferencia entre freeSize y availableSize? – zsniperx

+0

He editado mi respuesta para incluir la información que solicitó. – inazaruk

+0

¡Gracias! lo verificará una vez que tenga tiempo. Gran respuesta – zsniperx

3
/************************************************************************************************* 
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 int TotalMemory() 
    { 
     StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath()); 
     int Total = (statFs.getBlockCount() * statFs.getBlockSize())/1048576; 
     return Total; 
    } 

    public int FreeMemory() 
    { 
     StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath()); 
     int Free = (statFs.getAvailableBlocks() * statFs.getBlockSize())/1048576; 
     return Free; 
    } 

    public int BusyMemory() 
    { 
     StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath()); 
     int Total = (statFs.getBlockCount() * statFs.getBlockSize())/1048576; 
     int Free = (statFs.getAvailableBlocks() * statFs.getBlockSize())/1048576; 
     int Busy = Total - Free; 
     return Busy; 
    } 
+0

El uso de "TotalMemory" me devuelve -1166 ... Incluso si cambio los tipos de variables a long, me devuelve 3071504384, que no es lo que tengo (~ 3GB en comparación con ~ 32GB). –

2

Para la memoria interna Environment.getRootDirectory() getAbsolutePath() no es el enfoque correcto.

También en la mayoría de los dispositivos

Environment.getDataDirectory() no funciona, pero una vez más consistente.

Para el enfoque de directorio externo es correcto. Para diferenciar entre el uso interno de mnt/sdcard

Environment.isExternalStorageRemovable().

Pero todavía me pregunto cómo obtener la memoria interna exacta. Al igual que con la incoherencia de código abierto y muchas versiones.

+0

¿Encontró la respuesta? –

0

En la mayoría de los teléfonos, el total de bloques es el número de bloques disponibles para el usuario (es decir, menos almacenamiento del sistema, etc.).Todavía no he encontrado un método que proporcione la cantidad total de almacenamiento en el teléfono.

Cuestiones relacionadas