如何通过编程获取Android系统大小?(设备总存储查询需求)
如何获取包含Android系统占用的设备总存储容量
我完全懂你的需求——你想拿到设备真实的总存储容量,但常规获取内存的方法只会返回用户可用分区(比如/data)的大小,漏掉了系统分区(/system、/vendor等)占用的空间,对吧?下面给你分版本介绍可行的实现方案:
一、Android Q(API 29)及以上:使用官方推荐的StorageManager API
从Android 10开始,系统提供了更完善的存储统计API,可以直接获取包含系统占用的总存储容量,这也是最推荐的方式。
代码实现(Kotlin)
import android.content.Context import android.os.Build import android.os.storage.StorageManager import android.os.storage.StorageVolume fun getTotalStorageIncludingSystem(context: Context): Long { val storageManager = context.getSystemService(StorageManager::class.java) return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 获取所有存储卷,找到主内部存储卷 val primaryVolume = storageManager.storageVolumes.firstOrNull { it.isPrimary } primaryVolume?.let { volume -> // 获取该存储卷的统计信息,totalBytes包含系统、应用、用户数据的所有空间 val storageStats = storageManager.getStorageStats(volume.uuid) storageStats.totalBytes } ?: 0L // 找不到主存储卷时返回0 } else { // 处理低版本系统的逻辑,下面会说明 getLegacyTotalStorage(context) } } private fun getLegacyTotalStorage(context: Context): Long { // API29以下,第三方APP无法直接获取系统分区大小,只能拿到用户可用分区的总容量 val externalDir = android.os.Environment.getExternalStorageDirectory() val statFs = android.os.StatFs(externalDir.path) return statFs.blockCountLong * statFs.blockSizeLong }
关键说明
storageStats.totalBytes:这个值代表主存储卷的全部容量,包括系统分区、应用安装分区、用户数据分区等所有占用的空间,完全符合你的需求。- 权限注意:访问主存储卷的统计信息不需要额外权限;如果要访问外部SD卡等其他存储卷,可能需要
MANAGE_EXTERNAL_STORAGE权限(需用户手动授权)。
二、Android Pie(API 28)及以下:受限的解决方案
在API29之前,Android系统对第三方APP隐藏了系统分区的统计信息,所以常规方法只能拿到用户可用分区(/data)的总容量,无法直接获取系统占用的部分。如果一定要拿到包含系统的总容量,只有两种途径:
1. Root设备下读取系统文件
如果设备已Root,可以直接读取存储设备的硬件信息来获取总容量,比如:
import java.io.BufferedReader import java.io.FileReader fun getTotalStorageWithRoot(): Long { // 通常内部存储设备路径是/sys/block/mmcblk0/size,不同设备可能略有差异 val sizeFile = "/sys/block/mmcblk0/size" return try { BufferedReader(FileReader(sizeFile)).use { reader -> val blockCount = reader.readLine().toLong() blockCount * 512 // 每个块默认是512字节,转换为总字节数 } } catch (e: Exception) { e.printStackTrace() 0L } }
注意:不同设备的存储设备路径可能不同(比如mmcblk1),需要根据实际情况调整。
2. 估算系统占用大小(非精确)
如果没有Root权限,只能通过估算的方式:用设备宣传的总容量(比如用户买的是128G手机)减去常规方法拿到的可用分区总容量,得到系统占用的近似值。但这种方法依赖用户输入,无法自动获取。
总结
- API29+:用
StorageManager的getStorageStats是最准确、最合法的方式,直接拿到包含系统的总存储容量。 - API29以下:无Root时无法精确获取,只能拿到用户分区容量;Root后可读取系统硬件文件获取总容量。
内容的提问来源于stack exchange,提问作者Faz
相关产品推荐
相关产品推荐

