Android에서 배터리 잔량 및 상태 확인


109

배터리 잔량 및 상태 (전원 연결, 방전, 충전 등)는 어떻게 확인할 수 있습니까? 개발자 문서를 조사한 결과 BatteryManager 클래스를 찾았습니다. 그러나 그것은 어떤 메서드도 포함하지 않고 상수 만 포함합니다. 어떻게 사용합니까?


좀 더 조사한 끝에 BatteryManager.EXTRA_LEVEL을 찾았습니다.
Mohit Deshpande

여기에 배터리 비율을 얻기 위해이 방법을 확인 freakyjolly.com/android-useful-methods-and-functions/#5method
코드 스파이

답변:


124

다음 은 배터리 정보를 얻는 방법을 설명하는 코드 샘플입니다.

요약하자면 인 ACTION_BATTERY_CHANGED텐트에 대한 브로드 캐스트 수신기 는 동적으로 설정됩니다. 매니페스트에 선언 된 구성 요소를 통해 수신 할 수없고 Context.registerReceiver().

public class Main extends Activity {
  private TextView batteryTxt;
  private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context ctxt, Intent intent) {
      int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
      batteryTxt.setText(String.valueOf(level) + "%");
    }
  };

  @Override
  public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.main);
    batteryTxt = (TextView) this.findViewById(R.id.batteryTxt);
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  }
}

2
Intent.ACTION_BATTERY_CHANGED 정보 : 충전 상태, 수준 및 배터리에 대한 기타 정보를 포함하는 고정 방송입니다. 명시 적으로 Context.registerReceiver ()에 등록해야만 매니페스트에 선언 된 컴포넌트를 통해이를 수신 할 수 없습니다.
클래스 Android

2
@classAndroid 음, 네, 대답에 명시 적으로 명시되어 있습니다.
SirDarius

예 @SirDarius, 다른 사람들에게 알립니다. 나는 당신의 대답을 먼저 찬성하고 그것을 발견했을 때이 의견을 올렸습니다. :)
클래스 Android

13
unRegisterReceiver onPause 또는 onDestroy를 잊지 마십시오.
Dave Doga Oz

새로운 Keywork로 배터리 관리자를 설치할 수 없습니다.
subhashchandru

102

API 21 이후로 다음을 사용하여 현재 배터리 수준을 백분율로 얻을 수 있습니다.

BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

65

공식 Android 문서를 기반으로 Helper 또는 Util 클래스에서이 메서드를 사용하여 현재 배터리 비율을 가져올 수 있습니다.

public static int getBatteryPercentage(Context context) {

    if (Build.VERSION.SDK_INT >= 21) {

         BatteryManager bm = (BatteryManager) context.getSystemService(BATTERY_SERVICE);
         return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

    } else {

         IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
         Intent batteryStatus = context.registerReceiver(null, iFilter);

         int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
         int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;

         double batteryPct = level / (double) scale;

         return (int) (batteryPct * 100);
   }
}

공식 문서에서 한 가지 실수로 double 대신 float int level = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1) : -1; int scale = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1) : -1; double batteryPct = (double) level / (double) scale; int percent = (int) (batteryPct * 100D);
user2212515

2
@ user2212515, 공식 문서를 기반으로 내 답변을 편집 해 주시겠습니까?
blueware

@Ryan, 나는 안드로이드 v21 이상을 지원하기 위해 내 대답을 편집했습니다. 그것을 확인하시기 바랍니다.
blueware

14

Android의 BatteryManager가 고정 인 텐트를 사용하므로 실제 BroadcastReceiver를 등록 할 필요가 없습니다.

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

return (int)(batteryPct*100);

이것은 https://developer.android.com/training/monitoring-device-state/battery-monitoring.html 의 공식 문서에서 가져온 것 입니다.


7

이를 사용하여 나머지 요금을 백분율로 얻을 수 있습니다.

private void batteryLevel() {
        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                int level = -1;
                if (rawlevel >= 0 && scale > 0) {
                    level = (rawlevel * 100) / scale;
                }
                batterLevel.setText("Battery Level Remaining: " + level + "%");
            }
        };
        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReceiver, batteryLevelFilter);
    }

5

이 기능을 시도해보십시오.

void getBattery_percentage()
{
      IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
      Intent batteryStatus = getApplicationContext().registerReceiver(null, ifilter);
      int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
      int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
      float batteryPct = level / (float)scale;
      float p = batteryPct * 100;

      Log.d("Battery percentage",String.valueOf(Math.round(p)));
  }

4

배터리 비율을 확인하기 위해 BatteryManager 를 사용 합니다. 다음 메서드는 배터리 비율을 반환합니다.

소스 링크

public static float getBatteryLevel(Context context, Intent intent) {
    Intent batteryStatus = context.registerReceiver(null,
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int batteryLevel = -1;
    int batteryScale = 1;
    if (batteryStatus != null) {
        batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, batteryLevel);
        batteryScale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, batteryScale);
    }
    return batteryLevel / (float) batteryScale * 100;
}

이봐, 난이 사용하고 때로는 결과가 89입니다 때로는 00.89의 일어나는 소수의 뭐죠 이동
펨바 타망

1
private void batteryLevel() {
        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int rawlevel = intent.getIntExtra("level", -1);
                int scale = intent.getIntExtra("scale", -1);
                int level = -1;
                if (rawlevel >= 0 && scale > 0) {
                    level = (rawlevel * 100) / scale;
                }
                mBtn.setText("Battery Level Remaining: " + level + "%");
            }
        };
        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReceiver, batteryLevelFilter);
    }

1

공식 문서에서 한 가지 실수로 float 대신 double을 사용해야합니다. 0.53F * 100F = 52F이기 때문에

int level = batteryStatus != null ? 
batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; int scale = 
batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; 
double batteryPct = (double) level / (double) scale; int percent = (int) (batteryPct * 100D);

Math.round ()를 사용하는 대신 최종 값을 int로 캐스팅하여 (따라서 10 진수 0.x 값을 제거) 0.53F-> 52F 실수가 아닌가요?
Robyer

0

다른 답변에는 배터리 상태액세스 하는 방법이 언급되지 않았습니다 (흐르거나 말거나).

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.