Obtener todo el espacio total y disponible en Android

Que yo sepa, en Android, hay:

  • 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 obtengo el total y el disponible para cada uno con un control de que existen (algunos teléfonos no tienen una tarjeta SD interna)?

Gracias

Así es como obtiene los 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; 

Aquí se explica cómo obtiene los 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; 

Nota corta

Bloques gratis:

La cantidad total de bloques que están libres en el sistema de archivos, incluidos los bloques reservados (que no están disponibles para las aplicaciones normales).

Bloques disponibles:

La cantidad de bloques que están libres en el sistema de archivos y disponibles para las aplicaciones.


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

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

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

También en la mayoría de los dispositivos

Environment.getDataDirectory () funciona pero no es coherente.

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

Environment.isExternalStorageRemovable ().

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

En la mayoría de los teléfonos, el total de bloques es la cantidad 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.

StatFs : recupera información general sobre el espacio en un sistema de archivos. Esto es un contenedor para statvfs de Unix ().

Desde el nivel API 18 uso

 long getTotalBytes - The total number of bytes supported by the file system. 

Para un uso anterior de API

 int getBlockCount () int getBlockSize () StatFs stat = new StatFs(**path**); long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount(); 

Aquí necesitamos proporcionar el valor de cadena correcto para la variable de ruta. Necesita utilizar valores de cadena de ruta como esta: “/ mnt / external_sd /” “/ mnt / extSdCard /”

Puede recuperar la lista de todos / mnt / dispositivos y usar uno de estos valores.

 File mntDir = new File("/mnt/"); if(mntDir.isDirectory()){ String[] dirList = mntDir.list();...} 

o algo así como

 var file=new Java.IO.File("storage/"); var listOfStorages=file.ListFiles(); 

o

 String[] externals = System.getenv("SECONDARY_STORAGE").split(":");