You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:17:40