uni-app无开箱即用跨平台电池API;Vue2中uni.getBatteryInfo不可用,Android需原生桥接+权限声明+BroadcastReceiver实现,iOS须启用batteryMonitoringEnabled,真机调试为唯一可靠方式。

uni-app 没有统一、开箱即用的跨平台电池 API;uni.getBatteryInfo 在 Vue2 项目中不可用,打包后 Android 常因权限缺失直接静默失败,iOS 则依赖 UIDevice 手动开启监控——必须走 plus.android/plus.ios 原生桥接,且真机调试是唯一可靠验证方式。
Android 获取电量和充电状态要手动注册 BroadcastReceiver
Android 系统不提供实时监听接口,只能通过 Intent.ACTION_BATTERY_CHANGED 广播一次性读取当前快照。关键点在于:不能用 registerReceiver 传 null(部分 Android 8+ 会拒绝),必须用 plus.android.implements 实现一个真正的 BroadcastReceiver 类实例。
-
level和scale必须同时读取,单独读level可能返回 -1 或错误值 - 充电状态判断不能只看
BatteryManager.EXTRA_STATUS,还要结合BatteryManager.EXTRA_PLUGGED,否则“满电但未插线”会被误判为充电中 - 需要在
AndroidManifest.xml中声明android.permission.BATTERY_STATS(仅 targetSdkVersion ≥ 29 时强制要求),否则getSystemService(BATTERY_SERVICE)可能返回null - 示例中
Math.floor((level/scale)*100)是安全写法,避免浮点误差导致显示 100.0000000001%
iOS 必须先启用 batteryMonitoringEnabled 才能读 batteryLevel
iOS 的 batteryLevel 属性默认是 -1.0,不调用 setBatteryMonitoringEnabled(true) 就直接读,永远拿不到有效值。而且这个设置是一次性的,建议在应用启动时尽早执行,不要等到用户点“查电量”才触发。
-
dev.batteryLevel()返回的是0.0 ~ 1.0浮点数,需乘以 100 并Math.round()转整数百分比,否则小数位可能不一致 - 无法通过原生 API 获取 iOS 充电状态(如是否正在充电、USB/AC/Wireless),
UIDevice不暴露该能力;若需区分,只能靠定时轮询 + 电量变化趋势粗略判断(例如连续两次读数不变且 >99% 可视为充满) - 模拟器不支持电池相关 API,
plus.ios在模拟器下会返回undefined,必须用真机测试
Vue2 项目别碰 uni.getBatteryInfo 插件
官方 uni-getbatteryinfo 插件明确标注“仅支持 Vue3”,Vue2 项目里装了也编译不过,HBuilderX 调试模式能跑只是因为开发环境 mock 了部分行为,打包成 APK 后必然报错 Error: uts插件[uni-getbatteryinfo]编译失败。
- Vue2 项目唯一可行路径是封装自己的
getBatteryStatus工具函数,内部按plus.os.name分支处理 Android/iOS - 函数应返回统一结构:
{ level: 87, isCharging: true, isFull: false },避免上层业务反复做平台判断 - 注意兜底:当
plus不存在(如运行在微信小程序)或原生调用失败时,返回null或默认值,不要 throw 异常中断流程
最易被忽略的是 Android 权限和 iOS 监控开关——它们不是“调用一次就永久生效”,而是每次冷启动都得重置;另外,所有电量相关逻辑必须放在 onShow 或用户主动触发时机,不要在 onLoad 里静默执行,否则容易因生命周期顺序问题读到空值。











