2010-11-13 12 views

Respuesta

5

Algo como esto debería funcionar:

File sdcard = Environment.getExternalStorageDirectory(); 
StatFs stat = new StatFs(sdcard.getAbsolutePath()); 
long available = stat.getAvailableBlocks() * (long) stat.getBlockSize(); 
+0

muchas gracias Erich. esto hizo el trabajo para mí. – kaisar

1

puede que tenga que RESTAT para obtener resultados precisos:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath()); 
stat.restat(Environment.getExternalStorageDirectory().getAbsolutePath()); 
long available = ((long) stat.getAvailableBlocks() * (long) stat.getBlockSize()); 
+0

¿Por qué debería uno repetir? Vi esta sugerencia en otros lugares pero no hubo ninguna explicación de por qué. –

+0

No estoy del todo seguro, pero creo que el sistema operativo o JVM almacena en caché estos datos por motivos de rendimiento (cualquier disco IO va a ser mucho, mucho más lento que el procesamiento normal). Hacer un restat obliga a actualizar los datos. – Merkidemis

0

Echa un vistazo a esta función

private boolean is_sdCardSaveToUse(){ 

    /**default disk cache size in bytes*/ 
    final int DEFAULT_DISK_CACHE_SIZE = 1024 * 1024 * 10; //10 MB 

    /**get sdCard state*/ 
    String sdCardState = Environment.getExternalStorageState(); 

    /**check if the sdCard is mounted*/ 
    /**check if we can write to sdCard*/if (Environment.MEDIA_MOUNTED.equals(sdCardState)) { 
     if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(sdCardState)) { 
      Log.d("sdCard", "mounted readOnly"); 
     } else { 
      Log.d("sdCard", "mounted readWrite"); 

      /**get free usable space in bytes */ 
      long freeUsableSpace = Environment.getExternalStorageDirectory().getUsableSpace(); 
      int temp = Math.round(((float) freeUsableSpace/1024)/1024); //convert from bytes to MB. 
      Log.d("usableSpace= ", Integer.toString(temp) + " MB"); 

      if (freeUsableSpace > DEFAULT_DISK_CACHE_SIZE){ 
       return true; 
      } else { 
       Log.d("sdCard","not enough space"); 
       return false; 
      } 

     } 

    } else{ 
     Log.d("sdCard","not mounted"); 
     return false; 
    } 

    return false; 
} 
+0

Gracias por el código, pero ¿hay alguna razón especial para no usar la clase StatFs que se usa en las respuestas de los demás? – Jenix

Cuestiones relacionadas