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

Posted

技术标签:

【中文标题】获取 Android 上的所有总空间和可用空间【英文标题】:Getting all the total and available space on Android 【发布时间】:2011-06-15 12:56:27 【问题描述】:

据我所知,在 android 上,有:

应用程序和缓存的内存 某些手机上的内部 SD 卡(不可移动) 用于音乐和照片的外部 SD 卡(可拆卸)

如何通过检查它们是否存在(某些手机没有内部 SD 卡)来获取每个设备的总数和可用数据

谢谢

【问题讨论】:

【参考方案1】:

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

 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
 

【讨论】:

很好的回应!有什么方法可以获取内部 SD 卡的大小,而不是板载闪存? freeSize 和 availableSize 有什么区别? 我已经编辑了我的答案以包含您要求的信息。 谢谢!一旦我有时间就会检查出来。很好的答案 在模拟器上 statFs.getAvailableBlocks() 返回 0 但在普通设备上运行良好。我在模拟器上将内存设置为 400MB。当我使用它在模拟器上进行测试时,我可能会遗漏什么吗? 注意:在具有大量外部存储的设备上,使用返回 int 值的 StatFs 方法时可能会得到负值。这是 (IIRC) 因为 long 值被强制转换为 int,导致 int 溢出(int:32 位,long:64 位)。在这种情况下,您可能假设存在“很多" 设备上的可用空间,即使您不知道具体有多少【参考方案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 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;
    

【讨论】:

使用“TotalMemory”返回 -1166 ...即使我将变量类型更改为 long,它也会返回 3071504384 ,这不是我所拥有的(~3GB 与 ~32GB 相比)。 【参考方案3】:

用于内部存储器 Environment.getRootDirectory().getAbsolutePath() 方法不对。

也适用于大多数设备

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

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

Environment.isExternalStorageRemovable().

但我仍然想知道如何获得确切的内部记忆。与开源不一致和大量版本一样。

【讨论】:

你找到答案了吗?【参考方案4】:

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

【讨论】:

【参考方案5】:

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(":");

【讨论】:

以上是关于获取 Android 上的所有总空间和可用空间的主要内容,如果未能解决你的问题,请参考以下文章

如何通过C程序知道nfs共享上的可用空间和总空间?

如何在 swift 2.0 中使用 AttributesOfFileSystemForpaths 获取总磁盘空间和可用磁盘空间

如何获取 Posix 系统中的总可用磁盘空间?

Android获取外部和内部存储空间总大小

iPhone上的存储空间/高清空间通过代码

java SD卡相关的工具类包括获取SD卡是否可用,剩余空间,总空间,剩余空间是否足够..当然你必须先申请访问SD卡的权限。