Vue2项目中uni.getBatteryInfo不可用,需通过plus.android/plus.ios调原生:Android监听ACTION_BATTERY_CHANGED广播并计算百分比,iOS需先启用监控并处理归一化值,H5和小程序需分别兼容。

uni.getBatteryInfo 在 Vue2 项目里根本不能用
官方 API uni.getBatteryInfo 确实存在,但截至 2026 年 3 月,它仍依赖插件且仅支持 Vue3。Vue2 项目直接调用会静默失败,控制台无报错,success 回调不触发,fail 也不走——这是最坑的地方。
真正能落地的方案,是绕过 uni 封装,用 plus.android 和 plus.ios 直接调原生。但必须注意:这不是“多写几行就能跑”,而是平台逻辑完全不同,不能共用一套代码。
- Android 需要读取广播
Intent.ACTION_BATTERY_CHANGED,靠getIntExtra("level", -1)和getIntExtra("scale", -1)计算百分比 - iOS 必须先开启监控:
dev.setBatteryMonitoringEnabled(true),否则dev.batteryLevel()永远返回-1 - Android 还得提前在
AndroidManifest.xml加权限:android.permission.BATTERY_STATS(否则真机直接崩溃)
Android 获取电量要自己注册 BroadcastReceiver
别指望 plus.android.invoke(bm, "getIntProperty", BatteryManager.BATTERY_PROPERTY_CAPACITY) 能稳定工作——这个接口在 Android 10+ 上已被限制,很多机型返回 0 或抛异常。
唯一可靠的方式是监听系统广播。关键点不是“怎么写 receiver”,而是“什么时候注册”和“要不要 unregister”:
- 必须在 Activity 生命周期内注册,推荐在
onLoad或mounted里用main.registerReceiver -
IntentFilter必须明确设为Intent.ACTION_BATTERY_CHANGED,不能漏掉new实例 - 不需要手动
unregister——因为ACTION_BATTERY_CHANGED是 sticky broadcast,注册即得最新值,且系统不回收 - 电量计算务必用
Math.floor((level / scale) * 100),避免小数点后精度溢出(比如 94.9999999 → 94% 而非 95%)
iOS 的 batteryLevel 返回的是 0.0 ~ 1.0 浮点数
很多人拿到 dev.batteryLevel() 结果是 0.94,直接拼字符串显示 “0.94%”,这就错了。iOS 原生返回的是归一化值,必须乘以 100 再取整。
还有个隐形陷阱:模拟器完全不支持电池监控。Xcode 模拟器里 isBatteryMonitoringEnabled() 永远是 false,batteryLevel() 永远是 -1。不连真机,你永远测不出问题。
- 务必加判断:
if (level >= 0) { return Math.round(level * 100) } - 首次调用前必须
dev.setBatteryMonitoringEnabled(true),且该操作不可逆,只做一次即可 - 不要在页面卸载时关监控(
setBatteryMonitoringEnabled(false)),iOS 不需要,关了反而可能影响后续获取
H5 和小程序端只能妥协处理
H5 根本没有标准 API 获取电量,navigator.getBattery() 虽存在,但 Chrome 仅限 HTTPS + 桌面端,移动端基本不可用,uni-app 也未封装。强行调用会报 getBattery is not a function。
微信/支付宝小程序倒是有,但命名空间不同:wx.getBatteryInfo、my.getBatteryInfo,且返回值结构不一致(微信返回 level: "85" 字符串,支付宝返回 level: 85 数字)。uni-app 的兼容层没做这层抹平。
- 建议统一 fallback:H5 返回
null或固定值100,并加注释说明“H5 不支持” - 小程序需按平台判断:
uni.getSystemInfoSync().platform === 'mp-weixin',再分调用 - 别试图用 H5 拿到真实电量去“估算续航”,这种逻辑在实际交付中会被产品经理当场否掉
真机调试这事没法绕——iOS 必须用 iPhone,Android 至少得是 Android 8+ 真机,模拟器、云真机、远程调试器全都不行。电量不是个“有就行”的功能,它卡在系统底层权限和硬件抽象层之间,差一层就断。

















