如何在Android中获得已安装SD卡的实际尺寸?

时间:2013-04-28 19:50:59

标签: android memory size storage external

我正试图找到一种方法来查找手机上安装的SD卡的总大小和可用空间,从我对SOF的研究和Android开发者网站上我能够找到方法getExternalStorageDirectory()但是根据{{​​3}},这将返回一个不一定是外部的目录:

“传统上这是一张SD卡,但它也可以在与受保护的内部存储不同的设备中实现为内置存储,并且可以作为文件系统安装在计算机上。”

所以我从措辞的方式收集“外部存储”目录实际上可以分开多个物理存储设备(内部和外部存储器)。从我的测试结果来看,我发现使用这种方法返回的大小大约是我实际SD卡大小的1.5倍。

所以我的问题是,是否有一种程序化的方法来返回SD卡上的总大小和可用空间?手机本身可以给我这些信息,所以我觉得应该有办法,但我现在不知所措......任何帮助都将不胜感激!

编辑: 这是我目前用于总大小的代码

private long TotalSDMemory(){
    File path = Environment.getExternalStorageDirectory();
    StatFs stat = new StatFs(path.getAbsolutePath());
    long blockSize = stat.getBlockSize();
    long totalBlocks = stat.getBlockCount();
    long totalSpace = totalBlocks * blockSize;
    Log.d(TAG,"Size of total SD Memory: "+totalSpace);
    Log.d(TAG, "External storage emulated: "+Environment.isExternalStorageEmulated());
    return totalSpace;
}

编辑(2): 我不知道这有什么关系,但我有一个三星Galaxy S3,这是我用来测试代码,显然三星的外部存储器有不同的文件结构。这是一个链接,可以帮助其他人获得正确的大小: Android API

2 个答案:

答案 0 :(得分:2)

public String[] getSize() throws IOException {
    String memory="";
    Process p = Runtime.getRuntime().exec("df /mnt/sdcard");
    InputStream is =p.getInputStream();
    int by=-1;
    while((by=is.read())!=-1) {
        memory+=new String(new byte[]{(byte)by});
    }
    for (String df:memory.split("/n")) {
        if(df.startsWith("/mnt/sdcard")) {
            String[] par = df.split(" ");
            List<String> pp=new ArrayList<String>();
            for(String pa:par) {
                if(!pa.isEmpty()) {
                    pp.add(pa);
                }
            }
            return pp.toArray(new String[pp.size()]);

        }
    }
    return null;
}

getSize()[0]是/ mnt / sdcard。 getSize()[1]是sd的大小(例子12.0G),使用了getSize()[2],[3]是免费的,[4]是blksize

或者:

new File("/sdcard/").getFreeSpace() - bytes of free in long
new File("/sdcard/").getTotalSpace() - size of sd

答案 1 :(得分:0)

是的,有办法。

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long sdAvailSize = (long)stat.getAvailableBlocks()
               * (long)stat.getBlockSize();
//One binary gigabyte equals 1,073,741,824 bytes.
long gigaAvailable = sdAvailSize / 1073741824;

从这里得到:How can I check how much free space an SD card mounted on an Android device has?

关于获取总尺寸的问题,请点击此处:Getting all the total and available space on Android


<强> 编辑:

Marcelo Filho已指出此方法在API 18(KitKat)中已弃用。

Google建议改为使用getAvailableBlocksLong ()getBlockCountLong ()。两种方法都会返回值,返回双倍。

<强> 提示:

Kikiwa已经指出数据类型 long 应该与这些现在已弃用的方法一起使用,否则如果filesize太大,你可能会得到负值。