How To Check Availability Of Space On External Storage?
Solution 1:
Watch out with StatFs & int overflow on newer devices
The approach in this answeris broken on devices with large external storage. For example on my Nexus 7, it currently returns ~2 GB when in reality there is ~10 GB of space left.
// DOES NOT WORK CORRECTLY ON DEVICES WITH LARGE STORAGE DUE TO INT OVERFLOW
File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDirectory.getAbsolutePath());
int free = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1024 / 1024;
StatFs does have replacement methods returning long
, getAvailableBlocksLong()
and getBlockCountLong()
, but the problem is that they were only added in API level 18.
Use this instead
Simplest way is to use getFreeSpace()
in java.io.File, added in API level 9, which returns long
:
Returns the number of free bytes on the partition containing this path. Returns 0 if this path does not exist.
So, to get free space on the external storage ("SD card"):
FileexternalStorageDir= Environment.getExternalStorageDirectory();
longfree= externalStorageDir.getFreeSpace() / 1024 / 1024;
Alternatively, if you really want to use StatFs but need to support API level < 18, this would fix the integer overflow:
FileexternalStorageDir= Environment.getExternalStorageDirectory();
StatFsstatFs=newStatFs(externalStorageDir.getAbsolutePath());
longblocks= statFs.getAvailableBlocks();
longfree= (blocks * statFs.getBlockSize()) / 1024 / 1024;
Solution 2:
/******************************************************************************************
Returns size in MegaBytes.
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 = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
return total;
}
public long freeMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long free = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
return free;
}
public long busyMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long total = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
long free = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
long busy = total - free;
return busy;
}
Solution 3:
Use StatFs
and pass the path of the external storage directory to the constructor and you can call functions such as getAvailableBlocks()
and getBlockSize()
on the StatFs
object.
Solution 4:
I think you can use this statement to do with your problem. this cant check whether or no enough capacity of sdcard.
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
//to do something in here
}
Solution 5:
/**
* @return Number of bytes available on external storage
*/publicstaticlonggetExternalStorageAvailableSpace() {
long availableSpace = -1L;
try {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
.getPath());
stat.restat(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
e.printStackTrace();
}
return availableSpace;
}
Post a Comment for "How To Check Availability Of Space On External Storage?"