49 votes

Comment vérifier l'espace disponible sur un appareil Android ? sur une carte SD ?

Comment vérifier combien de Mo ou de Go il reste sur l'appareil Android ? J'utilise JAVA et Android SDK 2.0.1.

Existe-t-il un service système qui pourrait exposer quelque chose comme ça ?

76voto

La réponse de Yaroslav donnera la taille de la carte SD, pas l'espace disponible. La réponse de StatFs getAvailableBlocks() retournera le nombre de blocs qui sont encore accessibles aux programmes normaux. Voici la fonction que j'utilise :

public static float megabytesAvailable(File f) {
    StatFs stat = new StatFs(f.getPath());
    long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();
    return bytesAvailable / (1024.f * 1024.f);
}

Le code ci-dessus fait référence à certaines fonctions dépréciées depuis le 13 août 2014. Je reproduis ci-dessous une version mise à jour :

public static float megabytesAvailable(File f) {
    StatFs stat = new StatFs(f.getPath());
    long bytesAvailable = 0;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)
        bytesAvailable = (long) stat.getBlockSizeLong() * (long) stat.getAvailableBlocksLong();
    else
        bytesAvailable = (long) stat.getBlockSize() * (long) stat.getAvailableBlocks();
    return bytesAvailable / (1024.f * 1024.f);
}

56voto

Yaroslav Boichuk Points 908

Essayez ce code :

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());

long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable   = bytesAvailable / 1048576;

System.out.println("Megs: " + megAvailable);

Mise à jour :

getBlockCount() - retour de la taille de la carte SD ;

getAvailableBlocks() - retourner le nombre de blocs qui sont encore accessibles aux programmes normaux (merci Joe)

2 votes

Comme le dit Joe Wreschning, cela permet de déterminer la taille de la carte SD.

2 votes

Se référer à la réponse de Joe ci-dessous.

0 votes

Est-ce que "megAvailable" correspond à la taille des données de la carte SD ou à l'espace libre disponible sur la carte SD ?

23voto

J'ai conçu quelques fonctions prêtes à l'emploi pour obtenir l'espace disponible dans différentes unités. Vous pouvez utiliser ces méthodes en copiant simplement l'une d'entre elles dans votre projet.

/**
 * @return Number of bytes available on External storage
 */
public static long getAvailableSpaceInBytes() {
    long availableSpace = -1L;
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();

    return availableSpace;
}

/**
 * @return Number of kilo bytes available on External storage
 */
public static long getAvailableSpaceInKB(){
    final long SIZE_KB = 1024L;
    long availableSpace = -1L;
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    return availableSpace/SIZE_KB;
}
/**
 * @return Number of Mega bytes available on External storage
 */
public static long getAvailableSpaceInMB(){
    final long SIZE_KB = 1024L;
    final long SIZE_MB = SIZE_KB * SIZE_KB;
    long availableSpace = -1L;
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    return availableSpace/SIZE_MB;
}

/**
 * @return Number of gega bytes available on External storage
 */
public static long getAvailableSpaceInGB(){
    final long SIZE_KB = 1024L;
    final long SIZE_GB = SIZE_KB * SIZE_KB * SIZE_KB;
    long availableSpace = -1L;
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    return availableSpace/SIZE_GB;
}

0 votes

Un grand merci pour ce bel exemple de code, il fonctionne à merveille :)

1 votes

Trouvez qu'il y a trop de répétitions. Bon code mais il pourrait être beaucoup plus petit.

1 votes

@Raigex non, il a dit que vous pouvez copier des parties individuelles donc vous ne pouvez utiliser qu'une seule d'entre elles.

6voto

Ilya_Gazman Points 3685

Sur la base de este réponse, ajout du support pour la version Android < 18

public static float megabytesAvailable(File file) {
    StatFs stat = new StatFs(file.getPath());
    long bytesAvailable;
    if(Build.VERSION.SDK_INT >= 18){
        bytesAvailable = getAvailableBytes(stat);
    }
    else{
        //noinspection deprecation
        bytesAvailable = stat.getBlockSize() * stat.getAvailableBlocks();
    }

    return bytesAvailable / (1024.f * 1024.f);
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private static long getAvailableBytes(StatFs stat) {
    return stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
}

5voto

android developer Points 20939

Aussi, si vous voulez vérifier l'espace disponible sur la mémoire interne, utilisez :

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());

...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X