Quiero obtener el tamaño de la memoria interna/externa de almacenamiento de mi dispositivo de programación. Estoy usando este trozo de código :

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);

File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format =  Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);

y el resultado que estoy obteniendo es :

11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB

El problema es que quiero conseguir que la memoria libre de la SdCard que es 1,96GB ahora. ¿Cómo puedo solucionar este código para que yo pueda obtener la libre tamaño ?

  • A partir de la API de nivel 18 que se ha cambiado el nombre del método para terminar con el Largo. Probablemente tendrá que agregar un control de nivel de API antes de que
  • Todas las soluciones que he intentado no trabaja nadie, cuando hago formato de almacenamiento interno … puede usted por favor me , ¿cómo lograr esto ?

11 Comentarios

  1. 172

    Siguiente es el código para su propósito :

    public static boolean externalMemoryAvailable() {
    return android.os.Environment.getExternalStorageState().equals(
    android.os.Environment.MEDIA_MOUNTED);
    }
    public static String getAvailableInternalMemorySize() {
    File path = Environment.getDataDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSizeLong();
    long availableBlocks = stat.getAvailableBlocksLong();
    return formatSize(availableBlocks * blockSize);
    }
    public static String getTotalInternalMemorySize() {
    File path = Environment.getDataDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSizeLong();
    long totalBlocks = stat.getBlockCountLong();
    return formatSize(totalBlocks * blockSize);
    }
    public static String getAvailableExternalMemorySize() {
    if (externalMemoryAvailable()) {
    File path = Environment.getExternalStorageDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSizeLong();
    long availableBlocks = stat.getAvailableBlocksLong();
    return formatSize(availableBlocks * blockSize);
    } else {
    return ERROR;
    }
    }
    public static String getTotalExternalMemorySize() {
    if (externalMemoryAvailable()) {
    File path = Environment.getExternalStorageDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSizeLong();
    long totalBlocks = stat.getBlockCountLong();
    return formatSize(totalBlocks * blockSize);
    } else {
    return ERROR;
    }
    }
    public static String formatSize(long size) {
    String suffix = null;
    if (size >= 1024) {
    suffix = "KB";
    size /= 1024;
    if (size >= 1024) {
    suffix = "MB";
    size /= 1024;
    }
    }
    StringBuilder resultBuffer = new StringBuilder(Long.toString(size));
    int commaOffset = resultBuffer.length() - 3;
    while (commaOffset > 0) {
    resultBuffer.insert(commaOffset, ',');
    commaOffset -= 3;
    }
    if (suffix != null) resultBuffer.append(suffix);
    return resultBuffer.toString();
    }

    Obtener el Tamaño de la RAM

    ActivityManager actManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    MemoryInfo memInfo = new ActivityManager.MemoryInfo();
    actManager.getMemoryInfo(memInfo);
    long totalMemory = memInfo.totalMem;
    • y cómo conseguir RAM tamaño de la memoria ? cómo total y cómo se utiliza ?
    • compruebe el código para el total de tamaño de la memoria RAM
    • getBlockSize() y getBlockCount están en desuso.
    • Gracias por la respuesta, tengo consulta , Si yo uso el medio Ambiente.getRootDirectory() en lugar de medio Ambiente.getDataDirectory para el cálculo de Almacenamiento Interno, me estoy haciendo alguna salida ..esto se refiere a la Memoria Interna de memoria de otros..
    • Muchas gracias, agradezco su ayuda!!
    • Probado en MOTO G2 de equivocarnos de datos para Almacenamiento Externo
    • Puede suceder que la pareja de la API de obtener obsoleto, comprobar que en developers.android.com
    • ¿Cómo usted también supervisar el almacenamiento disponible de la talla?
    • El uso a Largo en el final de API más reciente niveles(>18)
    • para ser más específicos: utilizar getBlockSizeLong() y getBlockCountLong() en lugar de (API level >= 18)
    • Muchas gracias por compartir el conocimiento
    • no mostrar el tamaño 0f de almacenamiento Externo en el lema g3 de almacenamiento interno está mostrando, pero cuando se convierte en sd_card se muestran mismo valor para almacenamiento externo como para el interno pls dígale a @DineshPrajapati
    • no debe confundirse con el método externalMemoryAvailable(), devuelve ‘true’, incluso si su dispositivo no tiene ninguna tarjeta SD. (Nexus 5, por ejemplo), este método es bueno para comprobar el estado de la memoria ahora mismo, está disponible para lectura/escritura. Es un «debe» de verificación antes de las operaciones con almacenamiento
    • Me siento obligado a señalar que no son 1000 bytes en kilobyte y 1000 kilobytes en un megabyte. Los ajustes de Android también se presenta este cálculo incorrecto en la ficha Almacenamiento.
    • 1024 bytes = 1 KB y 1024 KB = 1 MB
    • Es allí cualquier permisos para ser añadido a la nueva versión de Android ??
    • Aquí está mi «localizada» formatSize() versión + GB: (ejemplo: 1.172 GB de 1.84 GB) { double sizeInDouble = size; if (sizeInDouble >= 1024) { ...; if (sizeInDouble >= 1024) { ...; if (sizeInDouble >= 1024) { suffix = "GB"; sizeInDouble /= 1024; } } } NumberFormat nf = NumberFormat.getNumberInstance(Locale.getDefault()); DecimalFormat df = (DecimalFormat) nf; return df.format(sizeInDouble) + suffix; }
    • No Mostrar El Total Correcto Intenrnal Memmory
    • Es demasiado viejo Api por lo tanto, hay posibilidades de que es obsoleto.
    • Por favor Actualizar el Código no Su trabajo
    • La solución no funciona cuando hago formato de almacenamiento interno … puede usted por favor me , ¿cómo lograr esto
    • que parte de que el código no está trabajando?
    • código anterior funciona bien…en el caso normal, pero si el usuario selecciona la opción adoptables de almacenamiento, a continuación, no su trabajo,,,,google acaba de formato como opción de almacenamiento interno

  2. 37

    Esta es la forma en que yo lo hice :

    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    long bytesAvailable;
    if (android.os.Build.VERSION.SDK_INT >= 
    android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
    bytesAvailable = stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
    }
    else {
    bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();
    }
    long megAvailable = bytesAvailable / (1024 * 1024);
    Log.e("","Available MB : "+megAvailable);
    • pero esto es depracated 🙁
    • No trabajo para la API de nivel 9 y arriba!
    • Hizo chicos u averiguar el código de sustitución para esto?
    • no
    • Basta con sustituir getBlockSize y getAvailableBlocks con getBlockSizeLong y getAvailableBlocksLong.
    • esto no es llegar a la derecha del espacio disponible. Esto se está poniendo 1141 en lugar de 1678 @smg
    • Necesidad de implementación diferente para android Q adelante como Q tienen algunas restricciones para el acceso del sistema de archivos. Más info de verificación Ámbito de almacenamiento
    • La solución no funciona cuando hago formato de almacenamiento interno … puede usted por favor me , ¿cómo lograr esto

  3. 25

    Desde la API de 9 usted puede hacer:

    long freeBytesInternal = new File(ctx.getFilesDir().getAbsoluteFile().toString()).getFreeSpace();
    long freeBytesExternal = new File(getExternalFilesDir(null).toString()).getFreeSpace();
    • Archivo.getUsableSpace() es probablemente mejor, ya que probablemente no se ejecuta como root.
    • El File.getUsableSpace() parece un método más fácil para utilizar en lugar de utilizar StatFs. ¿Por qué utilizar StatFs @MarkCarter?
    • Usted podría utilizar StatFs si su minSdkVersion es de menos de 9.
    • ¿Cómo usted también supervisar el almacenamiento de los cambios ?
  4. 23

    Para obtener todos los disponibles carpetas de almacenamiento (incluyendo tarjetas SD), en primer lugar obtener los archivos de almacenamiento:

    File internalStorageFile=getFilesDir();
    File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);

    Entonces usted puede conseguir el tamaño disponible de cada uno de aquellos.

    Hay 3 maneras de hacerlo:

    API 8 y a continuación:

    StatFs stat=new StatFs(file.getPath());
    long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();

    API 9 y anteriores:

    long availableSizeInBytes=file.getFreeSpace();

    API de 18 años y más (no es necesario si la anterior es aceptar) :

    long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes(); 

    Para obtener un buen formato de cadena de lo que tienes ahora, usted puede utilizar:

    String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);

    o usted puede utilizar esto en caso de que desee ver exacto de bytes número, pero muy bien:

    NumberFormat.getInstance().format(availableSizeInBytes);

    Nota de que creo que el almacenamiento interno podría ser el mismo que el primero de almacenamiento externo, ya que la primera es la emulación de uno.


    EDITAR: Usar StorageVolume en Android Q y arriba, yo creo que es posible obtener el espacio libre de cada uno, usando algo como:

        val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
    val storageVolumes = storageManager.storageVolumes
    AsyncTask.execute {
    for (storageVolume in storageVolumes) {
    val uuid: UUID = storageVolume.uuid?.let { UUID.fromString(it) } ?: StorageManager.UUID_DEFAULT
    val allocatableBytes = storageManager.getAllocatableBytes(uuid)
    Log.d("AppLog", "allocatableBytes:${android.text.format.Formatter.formatShortFileSize(this,allocatableBytes)}")
    }
    }

    No estoy seguro de si esto es correcto, y no puedo encontrar una manera para obtener el tamaño total de cada uno, así que escribí sobre ello aquí, y le preguntó al respecto aquí.

    • Cómo obtener espacio libre en la tarjeta SD extraíble (o unidad flash USB OTG) en los dispositivos con la API de 23? nueva StatFs(archivo.getPath()).getAvailableBytes() o archivo.getUsableSpace() da 972546048 bytes, independientemente de almacenamiento real tamaño del Nexus 5 (Malvavisco 6.0.1).
    • El Nexus 5 no tiene ranura para tarjeta SD. ¿Cómo comprobarlo?
    • He comprobado que con USB OTG unidad flash.
    • No la usé nunca. Lo siento. Funciona bien en la API de 22 y abajo?
    • Sí, funciona bien hasta 22. code.google.com/p/android/issues/detail?id=200326
    • Qué hay de las otras formas de hacerlo?
    • No puedo encontrar otra manera de conseguir con la API de Archivo o Almacenamiento del Marco de Acceso. Supongo que es posible con USB Host API developer.android.com/intl/ru/guide/topics/connectivity/usb/…
    • Yo no lo encuentra.
    • Echa un vistazo en getLength() en github.com/mjdev/libaums/blob/…
    • Eso de «FatLfnDirectoryEntry «, sin embargo, lo consigue a través de la cto r…
    • ¿Qué significa – «cto r»? Constructor?
    • Sí. Cto r es Constructor.
    • Archivo[] externalStorageFiles=ContextCompat.getExternalFilesDirs(este,null); esta línea me da la salida «/storage/sdcard0/Android/data/com.demo.memorycarddemo/archivos» y tiene un único elemento en 0 índice mientras he extraíble sdcard montado en el dispositivo. Puede usted por favor me ayude a encontrar el camino de la extraíble sdcard ?
    • Es posible probarlo en Android 6 o superior? Si es así, tal vez es un asunto como este: code.google.com/p/android/issues/detail?id=200326
    • Sí, estoy leyendo actualmente de ese mismo hilo, pero no es capaz de encontrar la solución de la misma. Android 6.0 tiene este problema, pero este código es aún no funciona en 4.4.2. Actualmente estoy probando en 4.4.2 Está trabajando muy bien por debajo de Android 6.0?
    • Se supone que. Seguro que has añadido los permisos correctos? Sólo comenzando con Kitkat, debe proveer de usted los dos caminos sin permisos : developer.android.com/intl/ru/reference/android/support/v4/…, java.lang.Cadena) . Si no, es un bug. Por favor, publique un problema, y voy a estrella.
    • Realmente muchas gracias por su respuesta y la coordinación. He leído que todo google hilo de discusión y muchos desarrolladores publicado realmente grandes sugerencias y dado que la nueva 6.0 API, hay un montón de cosa cambió y debido a esto, estamos frente a un montón de problemas. He publicado el código de trabajo en stackoverflow.com/questions/8133417/… y en code.google.com/p/android/issues/detail?id=200326
    • Si usted NOS tiene OTG, a continuación, puedes comprobar por favor y háganme saber si está funcionando bien o no? En realidad no era un problema de permisos, pero ContextCompat.getExternalFilesDirs(este,null) me da sólo de teléfono externo de la ruta de almacenamiento y no extraíble ruta de almacenamiento. No está seguro de cuál era el problema. Así que terminé con la solución anterior.
    • necesitan diferencia entre .getFreeSpace() y .getAvailableSize() , he visto el primer caso que se da 11mb y último da 405kb
    • Donde es el uso de getAvailableSize ?
    • getAvailableBytes()
    • Bien, esto es extraño. Así que cual es el correcto? Y en qué casos usted notado? Tal vez usted debería informar de este error aquí: code.google.com/p/android/issues
    • getFreeSpace era más probable, pero getAvailableBytes da espacio para que las aplicaciones pueden usar creo
    • Si usted puede encontrar un escenario en el que son diferentes, y puede reproducir, por favor, envíe un informe de error aquí: code.google.com/p/android/issues , y voy a star demasiado.
    • Ya que hoy en día la API de 19 y más arriba, debe ser compatible con casi un 95%+ de dispositivos, me gustaría sugerir el uso de StatFs y el Formateador como se mencionó en la respuesta. Me estaba poniendo mal resultado, cuando el análisis es a la forma humana, por «1024» de la lógica, pero Fomatter trabajó como un encanto.
    • La solución no funciona cuando hago formato de almacenamiento interno … puede usted por favor me , ¿cómo lograr esto
    • Que solución, y ¿qué estás tratando de hacer? Que le pregunté acerca de esto en alguna parte? Si es así, por favor, mostrar un enlace.
    • stackoverflow.com/questions/39784846/…

  5. 7

    Pruebe este sencillo fragmento de

        public static String readableFileSize() {
    long availableSpace = -1L;
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)
    availableSpace = (long) stat.getBlockSizeLong() * (long) stat.getAvailableBlocksLong();
    else
    availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    if(availableSpace <= 0) return "0";
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" };
    int digitGroups = (int) (Math.log10(availableSpace)/Math.log10(1024));
    return new DecimalFormat("#,##0.#").format(availableSpace/Math.pow(1024, digitGroups)) + " " + units[digitGroups];
    }
    • Gracias, pero tengo la java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648 de error, parece que digitGroups resultado es -2147483648.
    • La solución no funciona cuando hago formato de almacenamiento interno … puede usted por favor me , ¿cómo lograr esto
  6. 6

    Es muy fácil averiguar el almacenamiento disponible si usted consigue interno como externo de la ruta de almacenamiento. También de teléfono externo de la ruta de almacenamiento realmente muy fácil de usar

    Medio ambiente.getExternalStorageDirectory().getPath();

    Así que estoy concentrando en cómo encontrar las rutas externas de almacenamiento extraíble como extraíble tarjeta sd, USB OTG(no probado USB OTG como yo no tiene USB OTG).

    Método a continuación le dará una lista de todos los posibles externo de almacenamiento extraíble caminos.

     /**
    * This method returns the list of removable storage and sdcard paths.
    * I have no USB OTG so can not test it. Is anybody can test it, please let me know
    * if working or not. Assume 0th index will be removable sdcard path if size is
    * greater than 0.
    * @return the list of removable storage paths.
    */
    public static HashSet<String> getExternalPaths()
    {
    final HashSet<String> out = new HashSet<String>();
    String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
    String s = "";
    try
    {
    final Process process = new ProcessBuilder().command("mount").redirectErrorStream(true).start();
    process.waitFor();
    final InputStream is = process.getInputStream();
    final byte[] buffer = new byte[1024];
    while (is.read(buffer) != -1)
    {
    s = s + new String(buffer);
    }
    is.close();
    }
    catch (final Exception e)
    {
    e.printStackTrace();
    }
    //parse output
    final String[] lines = s.split("\n");
    for (String line : lines)
    {
    if (!line.toLowerCase(Locale.US).contains("asec"))
    {
    if (line.matches(reg))
    {
    String[] parts = line.split(" ");
    for (String part : parts)
    {
    if (part.startsWith("/"))
    {
    if (!part.toLowerCase(Locale.US).contains("vold"))
    {
    out.add(part.replace("/media_rw","").replace("mnt", "storage"));
    }
    }
    }
    }
    }
    }
    //Phone's external storage path (Not removal SDCard path)
    String phoneExternalPath = Environment.getExternalStorageDirectory().getPath();
    //Remove it if already exist to filter all the paths of external removable storage devices
    //like removable sdcard, USB OTG etc..
    //When I tested it in ICE Tab(4.4.2), Swipe Tab(4.0.1) with removable sdcard, this method includes
    //phone's external storage path, but when i test it in Moto X Play (6.0) with removable sdcard,
    //this method does not include phone's external storage path. So I am going to remvoe the phone's
    //external storage path to make behavior consistent in all the phone. Ans we already know and it easy
    //to find out the phone's external storage path.
    out.remove(phoneExternalPath);
    return out;
    }
    • Como recuerdo, el uso de nombres de constantes para las rutas de manejo podría no funcionar en algunos dispositivos, como algunos podrían tener sus propios caminos. Espero que este no es el caso. +1 por el esfuerzo.
    • Gracias querido hasta la votación. Necesito el apoyo de todos para probar este código en tu dispositivo debido a que no tienen todos los dispositivos, pero probado en 4 diferentes dispositivos y funcionando bien. Por favor, deja un comentario aquí no está funcionando en cualquier cuerpo del móvil.
    • Solución agradable +1
    • La solución no funciona cuando hago formato de almacenamiento interno … puede usted por favor me , ¿cómo lograr esto
  7. 4

    Rápida incorporación a la memoria Externa tema

    No se deje confundir por el nombre del método externalMemoryAvailable() en Dinesh Prajapati la respuesta.

    Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) le da el estado actual de la memoria, si los medios de comunicación está presente y montado en su punto de montaje con acceso de lectura/escritura.
    Usted recibirá true incluso en dispositivos sin tarjetas SD, como el Nexus 5. Pero aún así es un ‘must-have’ método antes de cualquier operación con el almacenamiento.

    Para comprobar si hay una tarjeta SD en su dispositivo, puede utilizar el método ContextCompat.getExternalFilesDirs()

    No mostrar transitorio de dispositivos, tales como unidades flash USB.

    También ser conscientes de que ContextCompat.getExternalFilesDirs() en Android 4.3 y menor siempre de retorno de sólo 1 entrada (tarjeta SD si está disponible, de lo contrario Interna). Usted puede leer más acerca de él aquí.

      public static boolean isSdCardOnDevice(Context context) {
    File[] storages = ContextCompat.getExternalFilesDirs(context, null);
    if (storages.length > 1 && storages[0] != null && storages[1] != null)
    return true;
    else
    return false;
    }

    en mi caso fue suficiente, pero no olvides que algunos de los dispositivos Android podría tener 2 tarjetas SD, así que si usted necesita de todos ellos – ajustar el código de arriba.

  8. 1
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void showStorageVolumes() {
    StorageStatsManager storageStatsManager = (StorageStatsManager) getSystemService(Context.STORAGE_STATS_SERVICE);
    StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    if (storageManager == null || storageStatsManager == null) {
    return;
    }
    List<StorageVolume> storageVolumes = storageManager.getStorageVolumes();
    for (StorageVolume storageVolume : storageVolumes) {
    final String uuidStr = storageVolume.getUuid();
    final UUID uuid = uuidStr == null ? StorageManager.UUID_DEFAULT : UUID.fromString(uuidStr);
    try {
    Log.d("AppLog", "storage:" + uuid + " : " + storageVolume.getDescription(this) + " : " + storageVolume.getState());
    Log.d("AppLog", "getFreeBytes:" + Formatter.formatShortFileSize(this, storageStatsManager.getFreeBytes(uuid)));
    Log.d("AppLog", "getTotalBytes:" + Formatter.formatShortFileSize(this, storageStatsManager.getTotalBytes(uuid)));
    } catch (Exception e) {
    //IGNORED
    }
    }
    }

    StorageStatsManager clase introdujo Android O y encima que le puede dar un libre y el total de bytes en interna y externa de almacenamiento. Para el detallado con el código fuente, puedes leer mi artículo siguiente. usted puede utilizar la reflexión para menor que en Android O

    https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b

  9. 0

    Externa menory ,hay otra manera:

    File external = Environment.getExternalStorageDirectory();
    free:external.getFreeSpace();
    total:external.getTotalSpace();

  10. 0

    Esta es la forma en que yo lo hice..

    interna Total de la memoria

    double totalSize = new File(getApplicationContext().getFilesDir().getAbsoluteFile().toString()).getTotalSpace();
    double totMb = totalSize / (1024 * 1024);

    Interno de libre tamaño

     double availableSize = new File(getApplicationContext().getFilesDir().getAbsoluteFile().toString()).getFreeSpace();
    double freeMb = availableSize/ (1024 * 1024);

    Externo libre y total de la memoria

     long freeBytesExternal =  new File(getExternalFilesDir(null).toString()).getFreeSpace();
    int free = (int) (freeBytesExternal/ (1024 * 1024));
    long totalSize =  new File(getExternalFilesDir(null).toString()).getTotalSpace();
    int total= (int) (totalSize/ (1024 * 1024));
    String availableMb = free+"Mb out of "+total+"MB";

Dejar respuesta

Please enter your comment!
Please enter your name here