2

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

“传统上这是一张 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,这是我用来测试代码的,显然三星的外部存储器有不同的文件结构。这是一个可以帮助其他人获得正确大小的链接: 获取三星手机中 SD 卡的大小

4

2 回答 2

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
于 2013-04-28T20:19:04.263 回答
-1

是的,有办法。

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;

从这里得到:如何检查安装在 Android 设备上的 SD 卡有多少可用空间?

关于获取总大小的问题,请看这里:Getting all the total and available space on Android


编辑:

Marcelo Filho指出,这种方法在 API 18 (KitKat) 中已被弃用。

谷歌建议使用getAvailableBlocksLong ()andgetBlockCountLong ()代替。这两种方法都将返回一个值而不是双精度值。

暗示:

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

于 2013-04-28T20:09:23.743 回答