uni.getbatteryinfo 在微信/支付宝小程序中可用且稳定,h5 不支持,app 端不可靠;android 需广播监听+权限,ios 需启用电池监控并真机调试,跨平台须按平台分支处理。

uni.getBatteryInfo 能用吗?看平台再决定
在 H5 和小程序环境,uni.getBatteryInfo 是官方支持的最简方案,但 App(iOS/Android)真机上它大概率返回 errCode: 1002 或直接失败——这不是你代码写错了,是 DCloud 基座未默认开启底层权限或未桥接完整。
只有微信/支付宝小程序里调用才稳定生效;App 端必须绕过它,走原生 API。
- 微信小程序:可用,返回
level(0–100 整数)、isCharging - 支付宝小程序:同微信,但需确认基础库版本 ≥ 3.0
- App(HBuilderX 打包):不可靠,别依赖它做关键逻辑
Android 真机获取电量:必须加权限 + 用 Intent.ACTION_BATTERY_CHANGED
Android 不像 iOS 那样能直接查 BatteryManager 服务,而是要监听系统广播。不注册 receiver 就拿不到数据,不加权限就直接崩溃——不是报错,是闪退。
关键点:
- 必须在
manifest.json → Android 设置 → 权限配置中勾选android.permission.BATTERY_STATS(仅 Android 8.0+ 强制要求,但建议全加) - 不能用
plus.android.invoke(bm, 'getIntProperty', ...)方式(部分 Android 12+ 设备已禁用该接口) - 推荐用广播方式,兼容性最好,且能同时拿到电量、充电状态、电压、温度
示例片段(取电量百分比):
const Intent = plus.android.importClass('android.content.Intent');
const filter = new plus.android.importClass('android.content.IntentFilter')(Intent.ACTION_BATTERY_CHANGED);
const receiver = plus.android.runtimeMainActivity().registerReceiver(null, filter);
const level = plus.android.invoke(receiver, 'getIntExtra', 'level', -1);
const scale = plus.android.invoke(receiver, 'getIntExtra', 'scale', -1);
const batteryLevel = Math.round((level / scale) * 100); // 0–100
iOS 获取电量:UIDevice.batteryLevel() 有前提条件
iOS 的 batteryLevel 属性默认是关闭的,首次读取前必须显式启用监控,否则返回 -1.0。而且这个值只在设备插着线或亮屏时刷新,后台静默状态下不会更新。
- 必须调用
dev.setBatteryMonitoringEnabled(true),否则永远拿不到有效值 - 返回值是
0.0 ~ 1.0浮点数,记得 ×100 转成百分比显示 - 模拟器不支持——iOS 模拟器压根没电池,真机调试是唯一验证方式
示例:
const UIDevice = plus.ios.importClass('UIDevice');
const dev = UIDevice.currentDevice();
dev.setBatteryMonitoringEnabled(true); // ⚠️ 必须这一步
const level = dev.batteryLevel(); // 可能为 -1.0(未启用)或 0.0~1.0
跨平台统一封装要注意什么
别写个 getBattery() 函数就以为能到处跑。iOS 和 Android 返回结构不同,H5 根本没数据,小程序又带 isCharging 字段——硬统一反而容易出 bug。
- 不要试图返回统一对象结构,按平台分支处理更稳
- 电量数值类型不一致:Android 是整数百分比,iOS 是浮点小数,小程序是字符串数字
- 充电状态判断逻辑完全不同:Android 看
BatteryManager.EXTRA_STATUS+EXTRA_PLUGGED,iOS 只能靠UIDevice.batteryState()(需额外 import) - 真机测试前务必确认:iOS 开了「电池权限」(Xcode → Signing & Capabilities → Background Modes → Battery Monitoring),Android 插着 USB 调试并允许弹窗权限
最常被忽略的是:所有原生调用都只在 plus 存在时执行,上线前一定要加 if (typeof plus !== 'undefined') 守卫,否则 H5 环境直接报 ReferenceError。











