Android App端唯一可靠方法是plus.android调用StatFs读取Environment.getDataDirectory()路径;iOS、H5、小程序均无法获取真实剩余存储空间。

uni-app 无法跨端统一获取手机真实剩余存储空间,App 端 Android 可用 plus.android 调用 StatFs 获取内部存储剩余,iOS 完全不可行;H5 和小程序环境的 uni.getFileSystemManager().getAvailableStorage() 返回的是浏览器缓存配额或小程序本地限额,和手机真实空间无关。
Android App 端必须用 plus.android + StatFs 读取系统数据目录
这是目前唯一稳定、无需插件、且能拿到整机内部存储剩余空间的方法。关键不是“能不能调”,而是“路径选对没”:
-
Environment.getDataDirectory()是唯一可靠路径,返回如/data或/data/data/your.app.id—— 这是 Android 系统保障可访问的内部数据区 - 千万别用
Environment.getExternalStorageDirectory():Android 10+ 默认拒绝访问,getUsableSpace()会失败或返回 0 -
StatFs的getAvailableBlocks()和getBlockSize()必须成对使用,getAvailableBytes()在旧 API( - 返回值单位是字节,建议除以
1024 * 1024 * 1024转 GB 并保留两位小数,避免科学计数法干扰 UI
示例代码片段(仅限 App-Android):
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 App 端根本拿不到整机剩余空间
这不是 uni-app 的限制,是 iOS 系统级封锁:
- 没有公开 API 允许第三方 App 读取磁盘总容量或可用空间,
plus.ios也无对应类可导入 - 设置里看到的 “iPhone 存储空间” 是私有框架
MobileStorage渲染的,App 进程无权限调用 - 任何声称“JS 层纯前端获取 iOS 剩余空间”的方案,要么伪造固定值,要么依赖越狱环境(App Store 审核不通过)
- 如果你在 iOS 上看到非零返回,大概率是缓存了上次 Android 测试值,或误用了
plus.cache.calculate()(它只算 App 自身缓存)
uni.getFileSystemManager().getAvailableStorage() 在各端表现完全不同
这个 API 名字极具误导性,实际行为和平台强相关:
- H5 环境:返回浏览器
localStorage配额(通常 5–50MB),和硬盘无关 - 微信/支付宝等小程序:返回该小程序 sandbox 的本地存储上限(一般 10MB),不是设备空间
- App 端(Android/iOS):多数情况直接报错,或返回
{ availableSize: 0 }—— 这不是 bug,是设计如此,底层未桥接原生磁盘接口 - 参数
storageType: 'internal'或'external'在 App 端完全无效,传了也不起作用
补充:App 自身缓存大小可跨端获取,但≠手机剩余空间
如果你真正想监控的是“App 占了多少本地空间”,可以用 plus.cache.calculate():
- Android:统计
getCacheDir()下所有文件(含 WebView 缓存、临时下载等) - iOS:统计
NSCachesDirectory,不含 Documents 或 iCloud 同步内容 - 注意:
plus.runtime.getAppInfo().size返回的是安装包体积(.apk/.ipa),不是运行后膨胀的缓存 - 该值可用于触发自动清理逻辑,但它和“手机还剩多少 GB”是两个维度的事,别混用
真实场景中,最常被忽略的一点是:Android 端用 getDataDirectory() 拿到的剩余空间,反映的是 /data 分区,而非用户可见的“内部共享存储”(即“手机内存”那个数值)。后者在 Android 11+ 已被 scoped storage 严格隔离,应用无权全局统计 —— 所以你看到的数字比系统设置里小,是正常的,不是计算错了。


















