“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”
BroadcastReceiver
를 등록할 필요없이
현재 배터리 상태를 가지고 있는 Intent를 가져올 수 있다.
val batteryStatus: Intent? = registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
이제 이 Intent
를 가지고 다양한 정보를 가져올 수 있다.
정보를 가져올 때는 BatteryManager
의 상수들을 이용해서 가져온다.
val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
val isCharging = when(status) {
BatteryManager.BATTERY_STATUS_CHARGING -> true
else -> false
}
binding.tvIsCharging.text = when(isCharging) {
true -> "충전중"
false -> "충전중 아님"
}
기기가 현재 충전중인지 아닌지 알아낼 수 있다.
BatteryManager.EXTRA_STATUS
를 사용하여 가져온 뒤
각 상태에 따라서 처리를 할 수 있다.
상태의 종류는 아래와 같다.
BATTERY_STATUS_CHARGING
(충전중)BATTERY_STATUS_DISCHARGING
(방전중)BATTERY_STATUS_FULL
(가득 충전됨)BATTERY_STATUS_NOT_CHARGING
(충전중 아님0BATTERY_STATUS_UNKNOWN
(상태를 알 수 없음)사실 충전여부라는 것이 충전중이거나 아니거나 둘 중 하나라고 생각되어
필자는 CHARGING 상태 외에는 모두 false로 처리했다.
충전되는 방식을 알아볼 수 있다.
val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1
val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB
val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC
val wirelessCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS
binding.tvChargedType.text = when {
usbCharge -> "USB 충전"
acCharge -> "AC 충전"
wirelessCharge -> "무선 충전"
else -> "충전 제거됨"
}
BatteryManager.EXTRA_PLUGGED
는 현재 충전 중인 방식을 가져온다.
반환되는 종류는 아래와 같다.
BatteryManager.BATTERY_PLUGGED_USB
(USB 충전)BatteryManager.BATTERY_PLUGGED_AC
(유선충전기 충전)BatteryManager.BATTERY_PLUGGED_WIRELESS
(무선충전기 충전)만약 충전중이 아니라면 0을 반환한다.
퍼센트, 전압, 온도는 반환받은 값 그대로 사용하면 된다.
물론 Integer이기 떄문에 약간의 가공이 필요하다.
// 현재 배터리 퍼센트
val batteryPct = batteryStatus?.let {
val level = it.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = it.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
level * 100 / scale
}
// 현재 배터리 전압
val batteryVoltage = batteryStatus?.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1)
// 배터리 온도
val batteryTemperature = batteryStatus?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1)?.let {
it.toDouble() / 10
}
binding.apply {
tvChargedPercent.text = "$batteryPct%"
tvChargedVoltage.text = "${DecimalFormat("#.##").format(batteryVoltage!! * 0.001)}V"
tvBatteryTemperature.text = "$batteryTemperature'C"
}
배터리의 성능(충전 효율)의 상태도 알 수 있다.
val batteryHealth = batteryStatus?.getIntExtra(BatteryManager.EXTRA_HEALTH, -1)
val healthGood = batteryHealth == BatteryManager.BATTERY_HEALTH_GOOD
val healthCold = batteryHealth == BatteryManager.BATTERY_HEALTH_COLD
val healthDead = batteryHealth == BatteryManager.BATTERY_HEALTH_DEAD
종류는 아래와 같다.
BATTERY_HEALTH_GOOD
BATTERY_HEALTH_COLD
BATTERY_HEALTH_DEAD
BATTERY_HEALTH_UNKNOWN
이게 배터리 효율 퍼센트 구간 별로 나뉘는 거 같은데
그 기준은 찾아봐도 나오질 않는다..
나중에 다시 찾아보도록 하겠다.
3년이 지난 핸드폰에서 테스트해도 BATTERY_HEALTH_GOOD로
나오는 것으로 보아 특별한 하자가 있지 않는한 변화점은 없어보인다.
위 예제들을 모두 적용시킨 화면은 아래와 같다.
개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.