Android 有没有办法获取 SD 卡大小?

问题描述 投票:0回答:2

我已经在 Stack Overflow 和 Google 中尝试了与此相关的所有问题,但没有一个有效。我已经尝试过类似下一个链接的操作,但它返回与内部存储相同的内容:How to get an external storage sd card size (With Mounted SD card)?

例如,如果我有大约 12GB 内部存储和 4GB SD 卡存储,无论我使用什么方法,我总是得到与内部空间完全相同的 SD 空间数字。

Stack Overflow 中发布的旧方法似乎只适用于 Android KitKat,但不适用于下一个 Android 版本。

这个问题可以解决吗?

android storage android-sdcard sd-card
2个回答
8
投票

好吧,我一直想知道这个问题,但在网上找不到答案。这就是我所做的。它可能不是那么干净,但每次都对我有用。

对于我的情况:它返回 61,055 MB。我插入了 64 GB SD 卡。

哦,我忘了提及:我今天在 Samsung Galaxy S5 6.0Sony Xperia Z5 Premium 5.1.1 上进行了此确认。不过,我也有一个每天有几百人使用的应用程序,但我还没有遇到任何问题。

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
static String getExternalSdCardSize() {
    File storage = new File("/storage");
    String external_storage_path = "";
    String size = "";

    if (storage.exists()) {
        File[] files = storage.listFiles();

        for (File file : files) {
            if (file.exists()) {
                try {
                    if (Environment.isExternalStorageRemovable(file)) {
                        // storage is removable
                        external_storage_path = file.getAbsolutePath();
                        break;
                    }
                } catch (Exception e) {
                    Log.e("TAG", e.toString());
                }
            }
        }
    }

    if (!external_storage_path.isEmpty()) {
        File external_storage = new File(external_storage_path);
        if (external_storage.exists()) {
            size = totalSize(external_storage);
        }
    }
    return size;
}

private static String totalSize(File file) {
    StatFs stat = new StatFs(file.getPath());
    long blockSize, totalBlocks;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        blockSize = stat.getBlockSizeLong();
        totalBlocks = stat.getBlockCountLong();
    } else {
        blockSize = stat.getBlockSize();
        totalBlocks = stat.getBlockCount();
    }

    return formatSize(totalBlocks * blockSize);
}

private static String formatSize(long size) {
    String suffix = null;

    if (size >= 1024) {
        suffix = "KB";
        size /= 1024;
        if (size >= 1024) {
            suffix = "MB";
            size /= 1024;
        }
    }

    StringBuilder resultBuilder = new StringBuilder(Long.toString(size));

    int commaOffset = resultBuilder.length() - 3;
    while (commaOffset > 0) {
        resultBuilder.insert(commaOffset, ',');
        commaOffset -= 3;
    }

    if (suffix != null) resultBuilder.append(suffix);
    return resultBuilder.toString();
}

0
投票

我的手机内置 32GB 存储空间和 15GB SD 卡。对

df
执行
/mnt/sdcard
会得到 32GB 结果,这不是我们想要的。进一步挖掘,我发现了这个
/storage
目录。里面有 3 个文件:

shell@E5803:/storage $ ls
8E5D-12E2
emulated
self

对每个项目进行

df
给出以下结果:

shell@E5803:/storage $ df self                                                 
Filesystem               Size     Used     Free   Blksize
self                   889.4M     0.0K   889.4M   4096
shell@E5803:/storage $ df emulated                                             
Filesystem               Size     Used     Free   Blksize
emulated                22.6G    10.8G    11.8G   4096
shell@E5803:/storage $ df 8E5D-12E2/                                           
Filesystem               Size     Used     Free   Blksize
8E5D-12E2/              14.9G     2.3G    12.7G   32768

我认为神奇的命令是

"df /storage/" + mFilesArray[0]
,其中
mFilesArray[]
ls /storage
的结果。

(希望 Google 的家伙将来不要更改 SD 卡挂载点,我对此表示怀疑。)

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.