Pour obtenir tous les dossiers de stockage disponibles (y compris les cartes SD), vous devez d'abord obtenir les fichiers de stockage :
File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);
Ensuite, vous pouvez obtenir la taille disponible de chacun d'eux.
Il y a trois façons de procéder :
API 8 et moins :
StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();
API 9 et plus :
long availableSizeInBytes=file.getFreeSpace();
API 18 et plus (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 utiliser ceci dans le cas où vous souhaitez voir le nombre exact d'octets mais de façon agréable :
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 le stockage émulé.
EDIT : En utilisant StorageVolume sur Android Q et plus, je pense qu'il est possible d'obtenir l'espace libre de chacun, en utilisant quelque chose comme :
fun getStorageVolumesAccessState(context: Context) {
val storageManager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageVolumes = storageManager.storageVolumes
val storageStatsManager = context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager
for (storageVolume in storageVolumes) {
var freeSpace: Long = 0L
var totalSpace: Long = 0L
val path = getPath(context, storageVolume)
if (storageVolume.isPrimary) {
totalSpace = storageStatsManager.getTotalBytes(StorageManager.UUID_DEFAULT)
freeSpace = storageStatsManager.getFreeBytes(StorageManager.UUID_DEFAULT)
} else if (path != null) {
val file = File(path)
freeSpace = file.freeSpace
totalSpace = file.totalSpace
}
val usedSpace = totalSpace - freeSpace
val freeSpaceStr = Formatter.formatFileSize(context, freeSpace)
val totalSpaceStr = Formatter.formatFileSize(context, totalSpace)
val usedSpaceStr = Formatter.formatFileSize(context, usedSpace)
Log.d("AppLog", "${storageVolume.getDescription(context)} - path:$path total:$totalSpaceStr used:$usedSpaceStr free:$freeSpaceStr")
}
}
fun getPath(context: Context, storageVolume: StorageVolume): String? {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
storageVolume.directory?.absolutePath?.let { return it }
try {
return storageVolume.javaClass.getMethod("getPath").invoke(storageVolume) as String
} catch (e: Exception) {
}
try {
return (storageVolume.javaClass.getMethod("getPathFile").invoke(storageVolume) as File).absolutePath
} catch (e: Exception) {
}
val extDirs = context.getExternalFilesDirs(null)
for (extDir in extDirs) {
val storageManager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
val fileStorageVolume: StorageVolume = storageManager.getStorageVolume(extDir)
?: continue
if (fileStorageVolume == storageVolume) {
var file = extDir
while (true) {
val parent = file.parentFile ?: return file.absolutePath
val parentStorageVolume = storageManager.getStorageVolume(parent)
?: return file.absolutePath
if (parentStorageVolume != storageVolume)
return file.absolutePath
file = parent
}
}
}
try {
val parcel = Parcel.obtain()
storageVolume.writeToParcel(parcel, 0)
parcel.setDataPosition(0)
parcel.readString()
return parcel.readString()
} catch (e: Exception) {
}
return null
}
J'espère que cela pourra vous aider.
1 votes
Depuis le niveau 18 de l'API, la méthode a été renommée pour se terminer par Long. Il faudrait probablement ajouter une vérification du niveau d'API précédent.
0 votes
Toutes les solutions que j'ai essayées ne fonctionnent pas, quand je fais le formatage en tant que stockage interne ... pouvez-vous m'aider, comment faire pour réaliser cela ?
0 votes
Fermé en tant que duplicate - un post plus récent a des réponses jusqu'à Android R
0 votes
Réponse parfaite ici stackoverflow.com/a/30401010/5773037