Отримайте рівень заряду акумулятора в Android


109

Як я можу отримати рівень та стан акумулятора (підключений, розряджений, заряджений тощо)? Я досліджував документи розробників і знайшов клас BatteryManager. Але він не містить ніяких методів, лише константи. Як я навіть ним користуюся?


Після деякого ВІДОМОГО дослідження я знайшов BatteryManager.EXTRA_LEVEL.
Мохіт Дешпанде

Перевірте цей метод, щоб отримати відсоток батареї тут 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
Про наміри.ACTION_BATTERY_CHANGED: Це клейка трансляція, що містить стан зарядки, рівень та іншу інформацію про акумулятор. Ви не можете отримувати це через компоненти, задекларовані в маніфестах, лише чітко зареєструвавши їх у Context.registerReceiver ().
клас Android

2
@classAndroid добре, так, це прямо написано у відповіді.
SirDarius

Так @SirDarius, просто повідомляючи про це іншим. Я спочатку відхилив вашу відповідь і поставив цей коментар, коли дізнався її. :)
клас Android

13
не забудьте скасувати реєстраціюReceiver onPause або onDestroy.
Дейв Дога Оз

Не вдається інсталізувати диспетчер акумуляторів за допомогою нового 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; подвійний акумуляторPct = (подвійний) рівень / (подвійний) шкала; int відсоток = (int) (акумуляторPct * 100D);
користувач2212515

2
@ user2212515, чи не проти ви відредагувати мою відповідь на основі офіційних документів?
блювер

@Ryan, я відредагував свою відповідь на підтримку android v21 та пізніших версій. Будь ласка, перевірте це.
blueware

14

Вам не потрібно реєструвати фактичний BroadcastReceiver, оскільки BatteryManager для Android використовує липкий Намір:

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 - це переміщення десяткових знаків, що відбувається
Pemba

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

одна помилка в офіційних документах, ви повинні використовувати double, а не float. Тому що 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);

Хіба це не помилка 0,53F -> 52F, викликана перекиданням кінцевого значення в int (таким чином, позбавлення від нього будь-якого десяткового значення 0.x), а не використання Math.round ()?
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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.