如何获取安卓总的存储使用情况,特别是系统占据的空间?_(语言-java)

该问题来自社区帖: https://bbs.csdn.net/topics/615642377.为符合问答规范, 该问题经过ChatGPT优化
如何获取安卓总的存储使用情况,特别是系统占据的空间? 以下代码可以获取到Android设备的内部存储路径和外部存储路径:
String path1 = Environment.getDataDirectory().getAbsolutePath();
Log.d(TAG, "path1: " + path1);
//输出结果为: /data
String path2 = Environment.getExternalStorageDirectory().getPath();
Log.d(TAG, "path2: " + path2);
//输出结果为: /storage/emulated/0
但是以上方法只能获得存储总量和剩余空间,无法直接获取系统占据的空间。 如果你想得到系统占据空间的具体数值,可以通过执行以下步骤进行自测: 步骤1:先获取出整个存储空间的总大小,和剩余空间的大小。
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
步骤2:计算出系统空间占据的大小,具体求法为:总大小 - 剩余空间。
long totalSize = totalBlocks * blockSize;
long availSize = availableBlocks * blockSize;
//得出总空间bigger
long totalSize = bigger - availSize;
通过以上两个步骤,你就可以得出系统占据的空间大小了。因为不同设备的系统空间大小可能会有所不同,所以需要自行调试求解。

获取整个存储空间的总大小和剩余空间的大小。您可以使用StatFs类来获取这些信息。
计算出系统空间占据的大小。您可以使用总大小减去剩余空间大小来求得系统占据的空间大小。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我建议您使用以下步骤获取Android系统占用存储的具体大小:

    1.使用adb shell命令查看 /system 分区的大小信息,以确定系统分区的总大小

    adb shell df /system

    输出格式:

    Filesystem              Size    Used     Free    Blksize
    /dev                   919M    428K     919M      4096
    /mnt/secure            919M      0K     919M      4096
    /mnt/asec              919M      0K     919M      4096
    /mnt/obb               919M      0K     919M      4096
    /system               1024M    898M     126M      4096
    /data                 3669M   2023M    1646M      4096
    /cache                 490M      6M     484M      4096
    /persist                24M     84K      24M      4096
    /efs                  128M      4M     123M      4096
    /firmware              128M      8M     120M      4096
    

    从上面的输出可以看出,/system 分区的总大小是1024M。

    2.使用adb shell命令查看 /system 分区中已使用的空间大小

    adb shell du -sh /system

    输出格式:

    898M    /system
    

    从上面的输出可以看出,/system 分区中已使用的空间大小是898M。

    3.使用系统StoreStatsManager的API获取系统分区占据的空间大小

    由于Android 11及更高版本修改了文件存储方案,因此StoreStatsManager将替换之前的API。因此,如果您的设备运行的是Android 11或更高版本,则可以使用StoreStatsManager获取系统分区的大小。

    以下是使用StoreStatsManager获取系统分区大小的示例代码:

    long usedBytes = StorageStatsManager.STORAGE_STATS_UNKNOWN;
    long totalBytes = StorageStatsManager.STORAGE_STATS_UNKNOWN;
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        StorageStatsManager storageStatsManager =
                (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE);
    
        try {
            // 获取/system分区的UUID
            UUID systemUuid = storageStatsManager.getUuidForPath(Environment.getRootDirectory());
    
            //获取系统分区占用的空间大小
            StorageStats storageStats = storageStatsManager.queryStatsForUuid(systemUuid);
            usedBytes = storageStats.getAppBytes() + storageStats.getDataBytes()
                    + storageStats.getMediaBytes() + storageStats.getObbBytes();
            totalBytes = storageStats.getTotalBytes();
        } catch (Exception e) {
            Log.e(TAG, "Failed to get storage statistics", e);
        }
    }
    
    //将结果转换为单位为MB的大小
    float usedMb = (float) usedBytes / (1024 * 1024);
    float totalMb = (float) totalBytes / (1024 * 1024);
    
    Log.i(TAG, "Used space: " + usedMb + "MB");
    Log.i(TAG, "Total space: " + totalMb + "MB");
    

    注意:在Android 10及更低版本中运行时,以上代码将输出存储空间为“0MB”。因此,在这些旧版本中,建议使用第一种方法或第二种方法来获取系统分区的大小。

    希望这些步骤对您有所帮助!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^