You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中BATTERY_SERVICE类型不匹配错误的解决方法

Android使用BATTERY_SERVICE获取电池电量的类型不匹配问题解决

问题场景

我在Android Studio中尝试通过BATTERY_SERVICE获取电池电量变化,写了以下代码:

val bm = applicationContext.getSystemService(BATTERY_SERVICE) as BatteryManager

// 获取电池变化
val level: Int = bm.getIntProperty(BatteryManager.EXTRA_LEVEL,-1)
val scale: Int = bm.getIntProperty(BatteryManager.EXTRA_SCALE,-1)

执行时最后两行报出错误:

Type mismatch: inferred type is String but Int was expected

我试过找getIntProperty的替代方法,比如getIntExtra但一开始没找对用法,还担心EXTRA_LEVEL会不会失效,想知道能不能把String转Int适配,或者有没有更好的解决思路。

错误原因

BatteryManager.getIntProperty()方法要求传入的是电池属性常量(比如BATTERY_PROPERTY_CAPACITY这类int类型的常量),而EXTRA_LEVEL是广播Intent中携带数据的键,属于字符串类型,直接传入自然会触发类型不匹配错误。

解决方法

方法1:通过电池广播获取实时电量变化

获取电池电量变化的常规方式是注册ACTION_BATTERY_CHANGED系统广播,在广播接收器的onReceive方法中,通过传入的Intent直接读取电量数据,这也是我最终解决问题的代码:

val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
// 可选:计算电量百分比
val batteryPercent = if (scale > 0) (level * 100) / scale else -1

方法2:直接获取当前电量(无需监听变化)

如果只是需要获取当前的电量百分比,不需要监听实时变化,可以用BatteryManager.getIntProperty()配合正确的属性常量:

val bm = applicationContext.getSystemService(BATTERY_SERVICE) as BatteryManager
// 直接返回当前电量百分比(范围0-100)
val batteryPercent = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)

补充说明

EXTRA_LEVEL和EXTRA_SCALE是系统广播中稳定的字段,目前没有失效风险,放心使用即可。

内容的提问来源于stack exchange,提问作者Harmony Valley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:07:50