app端电量获取必须绕过uni.getbatteryinfo,android需用sticky广播监听action_battery_changed并读取level/scale计算百分比,ios需先调用setbatterymonitoringenabled(true);vue2中uni.getbatteryinfo完全不可用。

App端获取电量百分比不能靠 uni.getBatteryInfo——Vue2项目里它根本不会触发回调,Vue3虽支持但依赖插件且兼容性不稳。真正能落地的,是绕过 uni 封装,用 plus.android 和 plus.ios 直接调原生 API。
Android 端必须用 ACTION_BATTERY_CHANGED 广播,不能走 BatteryManager.getIntProperty
很多人试过 plus.android.invoke(bm, 'getIntProperty', BatteryManager.BATTERY_PROPERTY_CAPACITY),结果在 Android 10+ 上返回 0 或直接抛异常。这个接口已被系统限制,尤其在 targetSdkVersion ≥ 30 的应用中基本失效。
- 正确做法是注册 sticky broadcast:
Intent.ACTION_BATTERY_CHANGED -
registerReceiver第一个参数不能传null(Android 8+ 会拒绝),必须用plus.android.implements实现一个真正的BroadcastReceiver类 -
level和scale必须同时读取:单独读level可能返回 -1,导致除零或 NaN - 计算用
Math.floor((level / scale) * 100),避免浮点误差造成显示为100.0000000001% - 权限必须加:
android.permission.BATTERY_STATS,否则真机运行时直接闪退(不是报错)
iOS 端必须先启用监控,否则 batteryLevel 永远是 -1.0
dev.batteryLevel() 默认返回 -1.0,不是“没值”,而是明确表示监控未开启。不调 dev.setBatteryMonitoringEnabled(true) 就读,永远拿不到有效数据。
- 该方法只用调一次,建议在
App.vue的onLaunch中尽早执行 - 返回值是 0.0 ~ 1.0 的浮点数,不是百分比,必须乘以 100 再
Math.round() -
dev.isBatteryMonitoringEnabled()在模拟器里永远返回false,batteryLevel()永远是 -1 —— 不连真机,测不出任何东西 - 无法通过原生 API 获取具体充电方式(USB/AC/Wireless),只能靠轮询 + 电量变化趋势粗略判断
Vue2 项目里 uni.getBatteryInfo 是个“静默陷阱”
调用 uni.getBatteryInfo 后,既不进 success,也不进 fail,控制台无任何提示。这不是你代码写错了,是官方 API 在 Vue2 下压根没实现。
- 不要浪费时间查文档或重试参数,它就是不可用
- 别指望 H5 或小程序的写法能复用到 App 端——平台逻辑完全不同,必须分平台写
- 封装成工具函数时,务必用
if (plus && plus.os.name === 'iOS')或=== 'Android'显式判断,不能只靠process.env.UNI_PLATFORM - 返回值统一处理为整数百分比(0–100),避免前端展示时还要重复转换
最易被忽略的点:Android 广播注册后不用手动 unregister,因为 ACTION_BATTERY_CHANGED 是 sticky 类型;而 iOS 的监控启用是一次性操作,重复调用无副作用但没必要。真机调试前,先确认 AndroidManifest.xml 权限已勾选、iOS 的 UIBackgroundModes(若需后台电量更新)已配置——这些细节漏掉,代码再对也跑不起来。











