获取Android上的所有总空间和可用空间

时间:2011-01-25 22:35:14

标签: android environment sd-card android-sdcard

据我所知,在Android上有:

  • 应用和缓存的内部存储空间
  • 某些手机上的内置SD卡(不可拆卸)
  • 用于播放音乐和照片的外置SD卡(可移动)

我如何获得每张照片的总数和可用数量,并检查它们是否存在(某些手机没有内置SD卡)

由于

5 个答案:

答案 0 :(得分:32)

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

 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;

简短说明

免费区块:

  

总块数   在文件系统上免费,包括   保留块(不是   可用于正常应用程序)。

可用块:

  

免费的块数   文件系统,可用于   应用


以下是检测SD卡是否已安装的方法:

 String state = Environment.getExternalStorageState();
 if (Environment.MEDIA_MOUNTED.equals(state)) 
 {
   // We can read and write the media    
 } 
 else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
 {
    // We can only read the media     
 } 
 else 
 {
    // No external media
 }

答案 1 :(得分:3)

/*************************************************************************************************
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 int TotalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        int Total = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        return Total;
    }

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

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

答案 2 :(得分:3)

用于内存 Environment.getRootDirectory()。getAbsolutePath()不是正确的方法。

同样适用于大多数设备

Environment.getDataDirectory()有效但又不一致。

对于外部目录方法是对的。要区分内部mnt / sdcard使用

Environment.isExternalStorageRemovable()。

但我仍然想知道如何获得精确的内存。与开源不一致和许多版本一样。

答案 3 :(得分:0)

在大多数手机上,总块数是用户可用的块数(即较少的系统存储量等)。我还没有找到一种能够产生手机总存储量的方法。

答案 4 :(得分:0)

StatFs - 检索有关文件系统空间的整体信息。这是Unix statvfs()的包装器。

从API级别18使用

long getTotalBytes - The total number of bytes supported by the file system. 

对于较旧的API使用

int getBlockCount ()
int getBlockSize ()

StatFs stat = new StatFs(**path**);
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();

这里我们需要为路径变量提供正确的字符串值。 您需要使用路径的字符串值,如下所示: “到/ mnt / external_sd /” “/ MNT / extSdCard /”

您可以检索所有 / mnt / 设备的列表,并使用其中一个值。

File mntDir = new File("/mnt/");
if(mntDir.isDirectory()){ 
String[] dirList = mntDir.list();...}

或类似

var file=new Java.IO.File("storage/");
var listOfStorages=file.ListFiles();

String[] externals = System.getenv("SECONDARY_STORAGE").split(":");