Internal phone storage in Android

Use android.os.Environment to find the internal directory, then use android.os.StatFs to call the Unix statfs system call on it. Shamelessly stolen from the Android settings app:

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);

I had a hard time having mine works. So I would like to share my working code to save some guys some time.
Tested on a 32GB device and 1GB device.

// Return size is in Megabytes
public class DeviceMemory {

        public static long getInternalStorageSpace()
        {
            StatFs statFs = new StatFs(Environment.getDataDirectory().getAbsolutePath());
            //StatFs statFs = new StatFs("/data");
            long total = ((long)statFs.getBlockCount() * (long)statFs.getBlockSize()) / 1048576;
            return total;
        }

        public static long getInternalFreeSpace()
        {
            StatFs statFs = new StatFs(Environment.getDataDirectory().getAbsolutePath());
            //StatFs statFs = new StatFs("/data");
            long free  = ((long)statFs.getAvailableBlocks() * (long)statFs.getBlockSize()) / 1048576;
            return free;
        }

        public static long getInternalUsedSpace()
        {
            StatFs statFs = new StatFs(Environment.getDataDirectory().getAbsolutePath());
            //StatFs statFs = new StatFs("/data");
            long total = ((long)statFs.getBlockCount() * (long)statFs.getBlockSize()) / 1048576;
            long free  = ((long)statFs.getAvailableBlocks() * (long)statFs.getBlockSize()) / 1048576;
            long busy  = total - free;
            return busy;
        }
}

Tags:

Android