不能。uni-app 官方 API 仅支持获取应用沙盒缓存大小,无法直接读取手机总存储或剩余空间;Android 可通过 plus.android 调用 StatFs 获取数据目录所在分区可用空间,iOS 因沙盒限制无可靠方案。

uni-app 能否直接获取手机总存储/剩余空间?
不能。uni-app 官方 API(如 uni.getStorageInfo)只返回**应用沙盒内缓存大小**,和手机系统级存储无关;想读取真实磁盘空间,必须走原生桥接,且 Android 和 iOS 完全不同——Android 可行,iOS 在 App Store 审核机制下被禁止访问系统路径,无可靠方案。
Android 端用 plus.android 获取内部存储可用空间
这是目前最稳定、实测有效的做法,但要注意:它返回的是应用数据目录(/data/data/包名)所在分区的剩余空间,不是整个机身存储(如 /sdcard),但对大多数场景已足够判断是否“快满了”。
常见错误现象:Environment.getDataDirectory() 返回 Java File 对象,直接传给 StatFs 构造函数会报错“no suitable constructor found”,必须先用 plus.android.invoke(file, 'getPath') 提取路径字符串。
实操建议:
- 仅在
#ifdef APP-PLUS && #ifdef ANDROID下执行,iOS 直接跳过或 fallback 提示 - 别用
getBlockSizeLong()或getAvailableBlocksLong()—— HBuilderX 旧版 runtime 不支持 long 方法,必须用无后缀版本 - 计算时注意单位:Android Q+ 开始
getBlockSize()返回的是逻辑块大小(通常 4096),不是扇区大小,直接乘getAvailableBlocks()即可得字节数 - 别混淆
getAvailableBlocks()和getFreeBlocks():前者是应用可写空间(受配额限制),后者是磁盘真正空闲块数,应优先用前者
const Environment = plus.android.importClass('android.os.Environment');
const StatFs = plus.android.importClass('android.os.StatFs');
const dataDir = Environment.getDataDirectory();
const path = plus.android.invoke(dataDir, 'getPath');
const stat = new StatFs(path);
const blockSize = plus.android.invoke(stat, 'getBlockSize');
const availBlocks = plus.android.invoke(stat, 'getAvailableBlocks');
const bytes = blockSize * availBlocks;
iOS 端为什么几乎做不到?
iOS 沙盒机制严格限制进程访问除自身容器外的任何路径。NSFileManager 的 URLForDirectory:inDomain: 只能拿到 app bundle 或 Documents 等受限目录,而这些目录本身容量就由系统动态分配,无法反推整机剩余空间。第三方插件(如某些 Cordova 插件)尝试调用 NSURLVolumeAvailableCapacityKey,但在 iOS 13+ 后多数返回 -1 或被拒,且上架审核极可能被拒。
使用场景:如果你只是想提醒用户“清理手机空间”,不如引导跳转设置页:plus.runtime.openURL('app-settings:') (iOS)或 plus.runtime.openURL('package:你的包名') (Android),比硬读还靠谱。
应用缓存大小 ≠ 手机剩余空间,但常被误当替代方案
很多人用 uni.getStorageInfo 或 plus.cache.calculate 显示“缓存:245 MB”,就以为这是手机剩余额度——完全错误。它只统计 uni.setStorage、plus.storage、WebView 缓存等 app 自身产生的数据,不包含图片下载、音视频文件、SQLite 数据库等,更不反映 SD 卡或内部存储真实水位。
性能影响:频繁调用 plus.cache.calculate 会触发磁盘扫描,在低端 Android 机型上明显卡顿;而 uni.getStorageInfo 是纯内存读取,快但信息量极少。
实操建议:
- 展示缓存大小时,明确标注“本应用缓存”,避免误导用户
- 清除操作务必用
plus.cache.clear()+uni.clearStorageSync()组合,单清一个留一堆脏数据 - 若真需系统级空间感知,Android 建议加权限
android.permission.READ_EXTERNAL_STORAGE(targetSdk ≤ 29)或申请MANAGE_EXTERNAL_STORAGE(≥30,需商店说明理由),但依然只能查外部存储(SD 卡),不能查内置存储总容量
最现实的做法:Android 用 StatFs 查数据分区可用空间,iOS 放弃,统一引导用户手动查看设置。别在 iOS 上折腾路径解析或私有 API,既不稳定,也过不了审。











