Pour obtenir tous les dossiers de stockage disponibles (y compris les cartes SD), vous obtenez d'abord les fichiers de stockage:
File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
Ensuite, vous pouvez obtenir la taille disponible de chacun d'entre eux.
Il y a 3 façons de le faire:
API 8 et inférieur:
StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();
API 9 et supérieur:
long availableSizeInBytes=file.getFreeSpace();
API 18 et supérieur (non nécessaire si la précédente est correcte):
long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes();
Pour obtenir une belle chaîne formatée de ce que vous avez maintenant, vous pouvez utiliser:
String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);
ou vous pouvez l'utiliser au cas où vous souhaiteriez voir le nombre d'octets exact mais bien:
NumberFormat.getInstance().format(availableSizeInBytes);
Notez que je pense que le stockage interne pourrait être le même que le premier stockage externe, puisque le premier est celui émulé.
EDIT: En utilisant StorageVolume sur Android Q et supérieur, je pense qu'il est possible d'obtenir l'espace libre de chacun, en utilisant quelque chose comme:
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)}")
}
}
Je ne suis pas sûr que ce soit correct, et je ne peux pas trouver un moyen d'obtenir la taille totale de chacun, alors j'ai écrit à ce sujet ici et posé des questions à ce sujet ici .