一、可获取的信息
通过 android 的电池广播,你可以拿到:
| 信息 | 说明 |
|---|---|
| 当前电量 level | 当前电量百分比 |
| 电量最大值 scale | 一般 100 |
| 是否在充电 | ac / usb / 无线充电 |
| 充电开始 / 充电结束 | 通过广播监听 |
| 电池健康状态 | good、overheat 等 |
| 电池温度 | 部分机型支持 |
二、获取当前电量(无需注册广播)
android 推荐方式:
val batterymanager = context.getsystemservice(context.battery_service) as batterymanager val batterylevel = batterymanager.getintproperty(batterymanager.battery_property_capacity)
batterylevel 即为 0–100 的电量百分比
兼容 android 5–16。
三、监听开始充电 / 结束充电(广播方式)
android 使用以下广播:
- action_battery_changed(粘性广播,不需要手动注册)
- action_power_connected—— 插上电源(开始充电)
- action_power_disconnected—— 拔掉电源(停止充电)
四、实际可用代码(kotlin)
1. 监听充电状态的 broadcastreceiver
class batteryreceiver(private val callback: (batteryevent) -> unit) : broadcastreceiver() {
override fun onreceive(context: context, intent: intent) {
when (intent.action) {
intent.action_power_connected -> {
callback(batteryevent.chargestart)
}
intent.action_power_disconnected -> {
callback(batteryevent.chargestop)
}
intent.action_battery_changed -> {
val level = intent.getintextra(batterymanager.extra_level, -1)
val scale = intent.getintextra(batterymanager.extra_scale, 100)
val status = intent.getintextra(batterymanager.extra_status, -1)
val ischarging = status == batterymanager.battery_status_charging ||
status == batterymanager.battery_status_full
val percent = level * 100 / scale
callback(batteryevent.batteryinfo(percent, ischarging))
}
}
}
}
sealed class batteryevent {
data object chargestart : batteryevent()
data object chargestop : batteryevent()
data class batteryinfo(val level: int, val ischarging: boolean) : batteryevent()
}2. 在 activity / service 中注册
val receiver = batteryreceiver { event ->
when (event) {
is batteryevent.chargestart -> log.d("battery", "开始充电")
is batteryevent.chargestop -> log.d("battery", "停止充电")
is batteryevent.batteryinfo -> log.d("battery", "电量=${event.level}%, 是否充电=${event.ischarging}")
}
}
val filter = intentfilter().apply {
addaction(intent.action_battery_changed)
addaction(intent.action_power_connected)
addaction(intent.action_power_disconnected)
}
registerreceiver(receiver, filter)五、java 写法
public class batteryreceiver extends broadcastreceiver {
@override
public void onreceive(context context, intent intent) {
string action = intent.getaction();
if (intent.action_power_connected.equals(action)) {
log.d("battery", "开始充电");
} else if (intent.action_power_disconnected.equals(action)) {
log.d("battery", "停止充电");
} else if (intent.action_battery_changed.equals(action)) {
int level = intent.getintextra(batterymanager.extra_level, -1);
int scale = intent.getintextra(batterymanager.extra_scale, 100);
int status = intent.getintextra(batterymanager.extra_status, -1);
boolean ischarging = status == batterymanager.battery_status_charging ||
status == batterymanager.battery_status_full;
int percent = level * 100 / scale;
log.d("battery", "电量=" + percent + "% 是否充电=" + ischarging);
}
}
}注册:
intentfilter filter = new intentfilter(); filter.addaction(intent.action_battery_changed); filter.addaction(intent.action_power_connected); filter.addaction(intent.action_power_disconnected); registerreceiver(new batteryreceiver(), filter);
六、注意事项
1.无需权限
获取电量/充电状态 不需要任何危险权限。
2.action_battery_changed 是粘性广播
不需要手动发送,一调用 registerreceiver() 就能拿到当前电量。
3.android 10–16 完全兼容
这些电池广播没有废弃,可直接用。
七、如果你需要“首次进入页面就知道状态”
可以用:
val intent = context.registerreceiver(null, intentfilter(intent.action_battery_changed))
即可直接拿:
val level = intent?.getintextra(batterymanager.extra_level, -1) val status = intent?.getintextra(batterymanager.extra_status, -1)
到此这篇关于android实现获取手机的电池电量和充电状态的文章就介绍到这了,更多相关android获取手机信息内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论