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
相关产品推荐
相关产品推荐

