获取内部存储器的可用空间

Posted

技术标签:

【中文标题】获取内部存储器的可用空间【英文标题】:Get free space on internal memory 【发布时间】:2011-06-03 11:30:11 【问题描述】:

是否可以通过 android SDK 获取 Android 设备(而不是 SD 卡)上的可用内存量?

如果有,怎么做?

【问题讨论】:

Android get free size of internal/external memory的可能重复 【参考方案1】:

this 帖子可能很适合您的问题。

还要检查this thread。这里有很多关于 SO 的信息。

google了一下,这里是解决方案(在android git找到)

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

【讨论】:

我相信clamp实际上是在询问实际的存储空间,而不是内存使用情况(我是从SD卡的提及中推断出来的)。 不错的答案。据我所知,这不会产生任何严格的警告,使其成为主线程安全的。因为它与文件系统相关,所以我有一半期待严格模式警告。 返回的大小是KB还是MB? 如果我想监控内存值怎么办? )【参考方案2】:
/*************************************************************************************************
Returns size in bytes.

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  = ( (long) statFs.getBlockCount() * (long) statFs.getBlockSize());
        return Total;
    

    public long FreeMemory()
    
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        long   Free   = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
        return Free;
    

    public long BusyMemory()
    
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   Total  = ((long) statFs.getBlockCount() * (long) statFs.getBlockSize());
        long   Free   = (statFs.getAvailableBlocks()   * (long) statFs.getBlockSize());
        long   Busy   = Total - Free;
        return Busy;
    

将字节转换为人类可读的格式(如 1 Mb、1 Gb)

    public static String floatForm (double d)
    
       return new DecimalFormat("#.##").format(d);
    


    public static String bytesToHuman (long size)
    
        long Kb = 1  * 1024;
        long Mb = Kb * 1024;
        long Gb = Mb * 1024;
        long Tb = Gb * 1024;
        long Pb = Tb * 1024;
        long Eb = Pb * 1024;

        if (size <  Kb)                 return floatForm(        size     ) + " byte";
        if (size >= Kb && size < Mb)    return floatForm((double)size / Kb) + " Kb";
        if (size >= Mb && size < Gb)    return floatForm((double)size / Mb) + " Mb";
        if (size >= Gb && size < Tb)    return floatForm((double)size / Gb) + " Gb";
        if (size >= Tb && size < Pb)    return floatForm((double)size / Tb) + " Tb";
        if (size >= Pb && size < Eb)    return floatForm((double)size / Pb) + " Pb";
        if (size >= Eb)                 return floatForm((double)size / Eb) + " Eb";

        return "???";
    

【讨论】:

在进行数学运算之前,您需要将 blockCount 和 blockSize 转换为 long。否则,这些方法可能返回负值,因为总块计数乘以块大小将超过 int 的最大值。是的,我使用了代码并得到了否定。 @christophercotton 谢谢!完成。 您实际上需要执行 (long) statFs.getBlockCount() * (long) statFs.getBlockSize() 以确保它们被正确投射。 @christophercotton:准点,伙计!大多数新手 Java 程序员经常会犯这样的错误,即只将 long 转换为等式的一侧,并且无法弄清楚为什么会得到否定的结果。经验法则:在 Java 等式场景中,始终将相同的类型转换为等式的 both 侧。你不会出错的。 从 api18+ 开始,您可以删除演员表并改用 getAvailableBlocksLong() 和 getBlockCountLong()。【参考方案3】:

看起来StatFs 类可能是您需要使用的。我不确定哪个路径会被视为设备的根目录,但我相信无论目录如何,结果都是相同的,只要它是内部存储的一部分。这样的事情可能会奏效:

StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;

如果不出意外,StatFs 类应该可以让您在查找位置方面有一个良好的开端。

【讨论】:

酷!我试图为“/”获取它,但它不起作用。使用“/data”适用于内部存储器。【参考方案4】:

有些方法自 2013 年以来已被 Google 弃用,您可以更改这些方法(仅限 API 18+):

getAvailableBlocks()getAvailableBlocksLong() getBlockCount()getBlockCountLong() getBlockSize()getBlockSizeLong() getFreeBlocks()getFreeBlocksLong()

【讨论】:

【参考方案5】:

在内部内存非常大的设备上,它不起作用,因为 int 值太小。例如,在摩托罗拉 xum 上它不起作用。你必须使用这样的东西:

int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes / 1024);

【讨论】:

【参考方案6】:
/**
 * @return Number of bytes available on internal storage
 */
public static long getInternalAvailableSpace() 
    long availableSpace = -1L;
    try StatFs stat = new StatFs(Environment.getDataDirectory()
            .getPath());
        stat.restat(Environment.getDataDirectory().getPath());
        availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
     catch (Exception e) 
        e.printStackTrace();
    

    return availableSpace;

【讨论】:

【参考方案7】:

请参考此链接:Android get free size of internal/external memory 这可能会有所帮助。在这里,一切都得到了很好的解释。

【讨论】:

以上是关于获取内部存储器的可用空间的主要内容,如果未能解决你的问题,请参考以下文章

Android存储及getCacheDir()getFilesDir()getExternalFilesDir()getExternalCacheDir()区别

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

获取内部和外部存储信息-android

面具打不开内部存储空间

安卓获取多媒体(包括 视频音频图片)数据

如何在Flexbox内部输入可用空间? [重复]