본문 바로가기
Android

[Android] Battery check. 배터리 정보 가져오기

by bryan.oh 2020. 3. 18.
반응형

Android Battery
배터리 정보 조회

 

PowerConnectionReceiver.java

 

public class PowerConnectionReceiver extends BroadcastReceiver {

    private BatteryResultCallback batteryResultCallback;
    public PowerConnectionReceiver(BatteryResultCallback batteryResultCallback){
        this.batteryResultCallback = batteryResultCallback;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
            boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                    status == BatteryManager.BATTERY_STATUS_FULL;
            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            int batteryLevel = (int) (((float) level / (float) scale) * 100.0f);

            batteryResultCallback.callDelegate(batteryLevel, isCharging);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

 

배터리 상태를 receive 받았을 때 activity 에서 수행 할 작업을 넘기기위한 인터페이스 작성

BatteryResultCallback.java

public interface BatteryResultCallback {
	void callDelegate(int batteryLevel, boolean isCharging);
}

 

Activity 에서.

- 선언

private PowerConnectionReceiver powerConnectionReceiver;

- onCreate 메소드 안에서

powerConnectionReceiver = new PowerConnectionReceiver((batteryLevel, isCharging)->{
    Log.d("battery", String.format("%d%%", batteryLevel));
    Log.d("battery", isCharging?"충전중":"Cable 연결안됨");
    // ui 변경하려면 message handler 사용
});

// lambda 식을 사용안할 경우
/*
powerConnectionReceiver = new PowerConnectionReceiver(new BatteryResultCallback() {
    @Override
	public void callDelegate(int batteryLevel, boolean isCharging) {
        Log.d("battery", String.format("%d%%", batteryLevel));
        Log.d("battery", isCharging?"충전중":"Cable 연결안됨");
	}
});
*/

- onResume 에서 등록

    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    this.registerReceiver(powerConnectionReceiver, intentFilter);

- onPause 에서 해제

    this.unregisterReceiver(powerConnectionReceiver);

 

 

참고

AndroidManifest.xml 에 아래와 같이 하라고 나와있는 곳도 있는데 해도/안해도 정상 작동 합니다.

오히려 저걸 작성 했을 때 Build apk 를 하면 lint 경고가 발생하더군요. aab 생성할땐 괜찮았는데,

암튼 lint 경고가 찝찝하여 저는 manifest 에서 아래 부분은 추가하지 않았습니다.

    <receiver android:name=".PowerConnectionReceiver">
      <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        <action android:name="android.intent.action.BATTERY_LOW"/>
        <action android:name="android.intent.action.BATTERY_OKAY"/>
      </intent-filter>
    </receiver>
728x90
반응형

댓글