Android 获取手机存储总大小,系统占用空间

一、Android 存储介绍及通常查询大小

手机存储有两种,内置内存和外置内存(SD),目前可扩展内存的机型正在减少,大部分是内置存储的手机,内置128G、256G已经很常见,但如果有扩展功能的话,买个乞丐版+SD卡也是美滋滋,毕竟厂家增加存储空间后手机定价也不便宜。言归正传,获取存储空间,很简单,使用中的 android.os.StatFs,传入需查阅的内存路径即可查询总内存大小,剩余可用空间,已用空间,示例代码如下:

public void queryStorage(){
   
        StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath());

        //存储块总数量
        long blockCount = statFs.getBlockCount();
        //块大小
        long blockSize = statFs.getBlockSize();
        //可用块数量
        long availableCount = statFs.getAvailableBlocks();
        //剩余块数量,注:这个包含保留块(including reserved blocks)即应用无法使用的空间 
        long freeBlocks = statFs.getFreeBlocks();
        //这两个方法是直接输出总内存和可用空间,也有getFreeBytes
        //API level 18(JELLY_BEAN_MR2)引入
        long totalSize = statFs.getTotalBytes();
        long availableSize = statFs.getAvailableBytes();

		Log.d("statfs","total = " + getUnit(totalSize));
		Log.d("statfs","availableSize = " + getUnit(availableSize));
		
		//这里可以看出 available 是小于 free ,free 包括保留块。
		Log.d("statfs","total = " + getUnit(blockSize * blockCount));
		Log.d("statfs","available = " + getUnit(blockSize * availableCount));
        Log.d("statfs","free = " + getUnit(blockSize * freeBlocks));
}

private String[] units = {
   "B", "KB", "MB", "GB", "TB"};

/**
 * 单位转换
 */
private String getUnit(float size) {
   
        int index = 0;
        while (size > 1024 && index < 4) {
   
            size = size / 1024;
            index++;
        }
        return String.format(Locale.getDefault(), " %.2f %s", size, units[index]);
    }

示例运行截图:
内存示例
注:我手机只有内置存储,大小是 16G,用这个方法是不会把系统空间算进来的。计算SD卡容量,需要兼容不同厂家定制的挂载路径,只要有sd路径就可以查询容量,sd卡查询不在本文说明范围,可自行查找其他文章。

本文是为了实现查询手机存储总大小以及系统占用,所以需要使用Android的另一个类,存储管理 android.os.StorageManager,API地址 StorageManager

在 android 6.0 之前,只能查到共享卷即除系统外的内存大小,目前我没有找到其他可读取总内存的方法,如有请评论一下,在android 7.1 之后版本,StorageManager 提供一个方法 getPrimaryStorageSize 可以查询内置存储的总容量,所以在 6.0 - 7.0 版本也是不能查所有,以及计算系统的占用大小,7.1之后版本可以准确计算存储大小以及系统占用请求,如果你看到一些机型可以显示系统占用多少,有可能是厂商自行设计的API,具体你可以查看显示的总容量是否为自己购买的内存大小。下面进入正文。

二、类简介

StorageManager 从API level 9 (Android 2.3, Gingerbread) 引入,部分被hide修饰函数在不同android版本上区别较大,也有遇到过厂商会删除或者重写某些函数,所以在使用时要做好异常处理,因为NoSuchMethodException 很多。

基本函数,外暴露方法:

  • allocate 函数,为你的应用申请空间,查询可用空间等
  • cache 系统给应用提供的缓存
  • obb 隔离文件系统,处理如游戏安装包的外置资源,减少APK大小
  • StorageVolume 用户可以使用的共享/外置存储卷

但重点是里面被隐藏的方法,让我们对手机总存储查询及系统占用计算提供了可能,至于为什么@hide,如果曾有在不同系统版本调用或者看过android源码,会发现各个版本区别特别大,况且这也不是一个特别需要的功能。所以我们将使用反射来做这个查询,但仍会有很大几率失败,厂商的定制修改若不按常路出牌,开发要么做特殊适配,否则也是失败。[允悲]
隐藏方法@hide

  • public @NonNull List<VolumeInfo> getVolumes() 获取手机所有存储卷,内置和外置
  • public long getPrimaryStorageSize() 获取内置存储大小,主要用来计算系统占用
  • 隐藏类 VolumeInfo 存储卷的基本信息
三、查询

存储空间查询分两步,一是内置存储,二是外置存储。
系统大小,获取内置大小减去内置存储块大小(系统 = 内置总 - volume.getPath().getTotalSpace())

Talk is cheap,show me the code.

1. android 6.0 之前版本查询(6.0-7.0 版本也适用)

上面说过在 6.0 - 7.0 版本也是不能查总存储空间,以及计算系统的占用大小,所以可以直接通过 StatFs 来查询(代码在上面),不过外置存储的话需要去适配sd路径,比较麻烦。
下面是通过 StorageManager 做的内存查询,需做版本区分

public void query(){
   
	StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
	float unit = 1024;
	int version = Build.VERSION.SDK_INT;
	if (version < Build.VERSION_CODES.M) {
   //小于6.0
		long totalSize = 0, availableSize = 0;
	    try {
   
	        Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
	        StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);
	        if (volumeList != null) {
   
	            Method getPathFile = null;
	            for (StorageVolume volume : volumeList) {
   
	                if (getPathFile == null) {
   
	                    getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
	                }
	                File file = (File) getPathFile.invoke(volume);
	                totalSize += file.getTotalSpace();
	                availableSize += file.getUsableSpace();
	            }
	        }
	    } catch (NoSuchMethodException e) {
   
	        e.printStackTrace();
	    } catch (IllegalAccessException e) {
   
	        e.printStackTrace();
	    } catch (InvocationTargetException e) {
   
	        e
  • 20
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: Android设备上的应用程序会使用缓存来提高其性能。缓存是一种内存储存,用于暂时存储数据,以便下次更快地访问。但是,缓存的过度使用对设备性能和存储空间都会产生影响。因此,Android系统允许用户查看和管理每个应用程序的缓存使用情况。 要获取应用程序的缓存使用情况,可以按照以下步骤操作: 1. 打开设备的“设置”应用程序。 2. 在设置应用程序中选择“应用程序”或“应用管理器”选项,这取决于您的设备型号和Android版本。 3. 从列表中选择您想要检查的应用程序。 4. 在应用程序详细信息页面上,您可以看到应用程序占用存储空间、已安装空间和缓存空间大小。 5. 点击“缓存”选项将显示这个应用程序的缓存大小。 6. 如果您想要清除缓存,可以点击“清除缓存”按钮。 以上就是如何在Android设备上获取应用程序缓存使用情况的简单步骤。通过查看和管理应用程序的缓存使用情况,可以释放存储空间,提高设备性能,并且确保您的应用程序在最佳的运行状态下工作。 ### 回答2: Android获取app占用缓存很简单。缓存是指临时存储的数据,例如图片、音频或视频等文件可以被缓存。缓存数据可以提高应用程序的性能,因为它使应用程序可以更快地从手机中读取数据,并且可以减少数据的使用情况。 要获取Android应用程序占用缓存,可以在Android设备中执行以下步骤: 1. 打开设置应用程序。 2. 然后点击“应用程序”。 3. 在打开的列表中找到你要查看的应用程序。 4. 点击该应用程序以打开详情页面。 5. 在详情页面中,你可以看到应用程序的大小以及它占用了多少存储空间和多少缓存。 6.如果你希望清除缓存,请点击“清除缓存”按钮。 请注意,清除应用程序的缓存可能会导致无法加载某些数据,因为它们需要重新下载或重新缓存。所以请在仔细考虑清除缓存之前,确定这样做不会导致不必要的问题。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值