배터리 상태 가져오기

지프치프·2022년 2월 28일
0

Android

목록 보기
43/86
post-thumbnail

“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 (충전중 아님0
  • BATTERY_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로
나오는 것으로 보아 특별한 하자가 있지 않는한 변화점은 없어보인다.

결과

위 예제들을 모두 적용시킨 화면은 아래와 같다.

image.jpg1image.jpg2

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글