16

您如何检查 SD 卡是否已满,以便您的应用程序可以决定它是否可以继续完成其工作,即写入外部存储或通知用户存储空间已用完。

4

6 回答 6

15

注意新设备上的 StatFs 和 int 溢出

此答案 中的方法在具有大型外部存储的设备上被打破。例如,在我的 Nexus 7 上,它当前返回 ~2 GB,而实际上还剩下 ~10 GB 的空间。

// 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 确实有替换方法返回long,getAvailableBlocksLong()getBlockCountLong(),但问题是它们仅在API 级别 18中添加。

改用这个

最简单的方法是在 API 级别 9 中添加getFreeSpace()的 java.io.Filelong中使用,它返回:

返回包含此路径的分区上的空闲字节数。如果此路径不存在,则返回 0。

因此,要在外部存储(“SD 卡”)上获得可用空间:

File externalStorageDir = Environment.getExternalStorageDirectory();
long free = externalStorageDir.getFreeSpace() / 1024 / 1024;

或者,如果你真的想使用 StatFs 但需要支持 API 级别 < 18,这将修复整数溢出:

File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDir.getAbsolutePath());  
long blocks = statFs.getAvailableBlocks();
long free = (blocks * statFs.getBlockSize()) / 1024 / 1024;
于 2014-01-17T09:29:06.380 回答
13
/******************************************************************************************
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;
    }
于 2012-01-11T20:51:27.703 回答
8

使用StatFs并将外部存储目录的路径传递给构造函数,您可以在对象上调用getAvailableBlocks()和等函数。getBlockSize()StatFs

于 2010-07-09T10:35:01.337 回答
4

我认为您可以使用此语句来解​​决您的问题。这无法检查 sdcard 是否有足够的容量。

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
    //to do something in here
}
于 2010-07-02T03:31:00.450 回答
0
/**
 * @return Number of bytes available on external storage
 */
public static long getExternalStorageAvailableSpace() {
    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;
}
于 2012-04-03T05:07:19.847 回答
0

以下是获取内部存储大小的方法:

 StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;

以下是获取外部存储大小(SD 卡大小)的方法:

 StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
 long blockSize = statFs.getBlockSize();
 long totalSize = statFs.getBlockCount()*blockSize;
 long availableSize = statFs.getAvailableBlocks()*blockSize;
 long freeSize = statFs.getFreeBlocks()*blockSize;
于 2016-04-15T10:15:53.620 回答