Quiero obtener el tamaño de la memoria libre en el almacenamiento interno / externo de mi dispositivo mediante programación. Estoy usando este 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 obtengo 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 obtener la memoria libre de SdCard que es 1,96GB
ahora mismo. ¿Cómo puedo corregir este código para poder obtener el tamaño libre?
android
android-sdcard
diskspace
Android-Droid
fuente
fuente
Respuestas:
A continuación se muestra el código para su propósito:
Obtener tamaño de RAM
fuente
getBlockSize()
ygetBlockCount
están en desuso.Esta es la forma en que lo hice:
fuente
getBlockSize
ygetAvailableBlocks
congetBlockSizeLong
ygetAvailableBlocksLong
.Desde API 9 puedes hacer:
fuente
File.getUsableSpace()
ve como un método más fácil de usar en lugar de utilizarStatFs
. ¿Por qué debería usarStatFs
@MarkCarter?Para obtener todas las carpetas de almacenamiento disponibles (incluidas las tarjetas SD), primero obtenga los archivos de almacenamiento:
Entonces puede obtener el tamaño disponible de cada uno de ellos.
Hay 3 formas de hacerlo:
API 8 y siguientes:
API 9 y superior:
API 18 y superior (no es necesaria si la anterior está bien):
Para obtener una cadena con formato agradable de lo que tiene ahora, puede usar:
o puede usar esto en caso de que desee ver el número de bytes exacto, pero muy bien:
Tenga en cuenta que creo que el almacenamiento interno podría ser el mismo que el primer almacenamiento externo, ya que el primero es el emulado.
EDITAR: Usando StorageVolume en Android Q y superior, creo que es posible obtener el espacio libre de cada uno, usando algo como:
No estoy seguro de si esto es correcto, y no puedo encontrar una manera de obtener el tamaño total de cada uno, así que escribí sobre esto aquí y pregunté al respecto aquí .
fuente
@ Android-Droid: está equivocado respecto
Environment.getExternalStorageDirectory()
al almacenamiento externo que no tiene que ser una tarjeta SD, también se puede montar en la memoria interna. Ver:Encuentra una ubicación de tarjeta SD externa
fuente
Prueba este sencillo fragmento
fuente
java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648
error, parece que eldigitGroups
resultado es -2147483648.Es muy fácil averiguar el almacenamiento disponible si obtiene una ruta de almacenamiento interna y externa. También la ruta de almacenamiento externo del teléfono es realmente muy fácil de averiguar usando
Así que solo me estoy concentrando en cómo encontrar las rutas de almacenamiento externo extraíble como tarjeta SD extraíble, USB OTG (no probado USB OTG ya que no tengo USB OTG).
El método siguiente le dará una lista de todas las posibles rutas de almacenamiento extraíbles externas.
fuente
Adición rápida al tema de la memoria externa
No se confunda con el nombre del método
externalMemoryAvailable()
en la respuesta de Dinesh Prajapati.Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
le proporciona el estado actual de la memoria, si el medio está presente y montado en su punto de montaje con acceso de lectura / escritura. Conseguirástrue
incluso en dispositivos sin tarjetas SD, como Nexus 5. Pero aún así es un método 'imprescindible' antes de cualquier operación con el almacenamiento.Para verificar si hay una tarjeta SD en su dispositivo, puede usar el método
ContextCompat.getExternalFilesDirs()
No muestra dispositivos transitorios, como unidades flash USB.
También tenga en cuenta que
ContextCompat.getExternalFilesDirs()
en Android 4.3 y versiones inferiores siempre se devolverá solo 1 entrada (tarjeta SD si está disponible, de lo contrario, interna). Puedes leer más sobre esto aquí .en mi caso fue suficiente, pero no olvides que algunos de los dispositivos Android pueden tener 2 tarjetas SD, así que si las necesitas todas, ajusta el código anterior.
fuente
La clase StorageStatsManager introdujo Android O y superior, que puede brindarle bytes libres y totales en almacenamiento externo / interno. Para obtener información detallada con el código fuente, puede leer mi siguiente artículo. puedes usar la reflexión para menos que Android O
https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b
fuente
Esta es la forma en que lo hice ...
memoria total interna
Tamaño libre interno
Memoria externa libre y total
fuente
Acerca de la menory externa, hay otra forma:
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();
fuente
Después de verificar el código de escritura de una solución diferente, este es un código completo para encontrar
'' ''
fuente