web-dev-qa-db-fra.com

Obtenir de l'espace libre sur la mémoire interne

Est-il possible d'obtenir la quantité de mémoire disponible sur un périphérique Android (pas sur la carte SD) via le SDK Android?

Si c'est le cas, comment?

38
clamp

this post pourrait bien correspondre à votre question.

vérifiez également ce fil . il y a tellement d'informations ici sur SO.

googlé un peu et voici la solution (trouvé à Android git )

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);
64
mad
/*************************************************************************************************
Returns size in bytes.

If you need calculate external memory, change this: 
    StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
to this: 
    StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
**************************************************************************************************/
    public long TotalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   Total  = ( (long) statFs.getBlockCount() * (long) statFs.getBlockSize());
        return Total;
    }

    public long FreeMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        long   Free   = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
        return Free;
    }

    public long BusyMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   Total  = ((long) statFs.getBlockCount() * (long) statFs.getBlockSize());
        long   Free   = (statFs.getAvailableBlocks()   * (long) statFs.getBlockSize());
        long   Busy   = Total - Free;
        return Busy;
    }

Conversion d'octets en format lisible par l'homme (comme 1 Mo, 1 Go)

    public static String floatForm (double d)
    {
       return new DecimalFormat("#.##").format(d);
    }


    public static String bytesToHuman (long size)
    {
        long Kb = 1  * 1024;
        long Mb = Kb * 1024;
        long Gb = Mb * 1024;
        long Tb = Gb * 1024;
        long Pb = Tb * 1024;
        long Eb = Pb * 1024;

        if (size <  Kb)                 return floatForm(        size     ) + " byte";
        if (size >= Kb && size < Mb)    return floatForm((double)size / Kb) + " Kb";
        if (size >= Mb && size < Gb)    return floatForm((double)size / Mb) + " Mb";
        if (size >= Gb && size < Tb)    return floatForm((double)size / Gb) + " Gb";
        if (size >= Tb && size < Pb)    return floatForm((double)size / Tb) + " Tb";
        if (size >= Pb && size < Eb)    return floatForm((double)size / Pb) + " Pb";
        if (size >= Eb)                 return floatForm((double)size / Eb) + " Eb";

        return "???";
    }
24
XXX

Il semble que la classe StatFs pourrait être ce que vous devez utiliser. Je ne sais pas quel chemin serait considéré comme la racine du périphérique, mais je pense que le résultat serait le même quel que soit le répertoire, tant qu'il fait partie du stockage interne. Quelque chose comme ça peut marcher:

StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;

Si rien d'autre, la classe StatFs devrait vous donner un bon départ sur où regarder.

9
kcoppock

Certaines méthodes sont obsolètes par Google depuis 2013 et vous pouvez les modifier (API 18+ uniquement):

  • getAvailableBlocks() à getAvailableBlocksLong()
  • getBlockCount() à getBlockCountLong()
  • getBlockSize() à getBlockSizeLong()
  • getFreeBlocks() à getFreeBlocksLong()
5
Anggrayudi H
/**
 * @return Number of bytes available on internal storage
 */
public static long getInternalAvailableSpace() {
    long availableSpace = -1L;
    try {StatFs stat = new StatFs(Environment.getDataDirectory()
            .getPath());
        stat.restat(Environment.getDataDirectory().getPath());
        availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return availableSpace;
}
2

S'il vous plaît se référer ce lien: Android obtenir la taille libre de la mémoire interne/externe Cela pourrait aider. Ici, tout est expliqué de manière agréable.

0
RightRe