Получить уровень заряда батареи и состояние в Android

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


person Mohit Deshpande    schedule 20.07.2010    source источник
comment
После еще нескольких исследований я нашел BatteryManager.EXTRA_LEVEL.   -  person Mohit Deshpande    schedule 20.07.2010


Ответы (9)


здесь приведен пример кода, объясняющий, как получить информацию о батарее.

Подводя итог, широковещательный приемник для намерения 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, -1);
      int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
      float batteryPct = level * 100 / (float)scale;
      batteryTxt.setText(String.valueOf(batteryPct) + "%");
    }
  };

  @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));
  }
}
person SirDarius    schedule 20.07.2010
comment
О Intent.ACTION_BATTERY_CHANGED: Это липкое вещание, содержащее состояние зарядки, уровень и другую информацию о батарее. Вы не можете получить это через компоненты, объявленные в манифестах, только явно зарегистрировавшись для этого с помощью Context.registerReceiver(). - person class Android; 06.05.2015
comment
@classAndroid ну да, это прямо указано в ответе. - person SirDarius; 06.05.2015
comment
Да, @SirDarius, просто дайте знать об этом другим. Я сначала проголосовал за ваш ответ и оставил этот комментарий, когда узнал об этом. :) - person class Android; 06.05.2015
comment
не забудьте отменить регистрацию ресивера при паузе или при уничтожении. - person Dave Doga Oz; 05.07.2015
comment
Не удается установить диспетчер батареи с новым Keywork, почему, сэр? - person subhashchandru; 19.12.2019
comment
EXTRA_LEVEL не является точным. Вам нужно масштабировать его. Подробнее см. эту ссылку. - person Robin Hsu; 19.02.2021
comment
нет состояния, только уровень, почему его приняли, если это не полный ответ? - person user924; 08.04.2021
comment
@user924 user924, если вы считаете, что можете улучшить этот ответ, пожалуйста, сделайте это. Если оригинальный постер принял этот ответ, я полагаю, что они были удовлетворены содержанием. - person SirDarius; 08.04.2021
comment
от автора вопроса Получить уровень заряда батареи и *состояние* в Android. Есть ли код для получения состояния в вашем коде? нет :) Проверьте здесь stackoverflow.com/a/59025376/7767664 - person user924; 08.04.2021

Поскольку SDK 21 LOLLIPOP можно использовать следующее, чтобы получить текущий уровень заряда батареи в процентах:

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

Прочтите BatteryManager  | Разработчики Android – BATTERY_PROPERTY_CAPACITY

person Mark    schedule 21.07.2016
comment
нет состояния, только уровень - person user924; 08.04.2021

Основываясь на официальной документации по Android, вы можете использовать этот метод в классе Helper или Util для получения текущего процента заряда батареи:

Версия Java:

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);
   }
}

Версия Kotlin:

fun getBatteryPercentage(context: Context): Int {
    return if (Build.VERSION.SDK_INT >= 21) {
        val bm = context.getSystemService(BATTERY_SERVICE) as BatteryManager
        bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    
    } else {
        val iFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
        val batteryStatus: Intent = context.registerReceiver(null, iFilter)
        val level = batteryStatus?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
        val scale = batteryStatus?.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
        val batteryPct = level / scale.toDouble()
        (batteryPct * 100).toInt()
    }
}
person blueware    schedule 19.02.2017
comment
одна ошибка в официальных документах, вы должны использовать 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) (batteryPct * 100D); - person user2212515; 04.08.2018
comment
@ user2212515, не могли бы вы отредактировать мой ответ на основе официальных документов? - person blueware; 04.08.2018
comment
@Ryan, я отредактировал свой ответ, чтобы поддерживать Android v21 и более поздние версии. Пожалуйста, проверьте это. - person blueware; 19.11.2019
comment
нет состояния, только уровень - person user924; 08.04.2021

Вам не нужно регистрировать фактический 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.

person bk138    schedule 30.09.2016

Вы можете использовать это, чтобы получить оставшуюся плату в процентах.

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);
    }
person reza.cse08    schedule 05.11.2015

попробуйте эту функцию, не нужно разрешение или какой-либо получатель

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)));
  }
person milan pithadia    schedule 30.06.2018

Чтобы проверить процент заряда батареи, мы используем 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;
}
person Code Spy    schedule 20.12.2018
comment
эй, я использовал это, и иногда результат 89, иногда 00,89, это перемещение десятичных знаков, что происходит - person Pemba Tamang; 05.09.2019

В других ответах не упоминалось, как получить доступ к состоянию батареи (загружается или нет).

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;
person FindOutIslamNow    schedule 25.11.2019
comment
Наконец-то кто-то ответил про состояние батареи - person user924; 08.04.2021

одна ошибка в официальных документах, вы должны использовать 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);
person user2212515    schedule 04.08.2018
comment
Разве это не ошибка 0.53F -> 52F, вызванная приведением конечного значения к int (таким образом удаляя из него любое десятичное значение 0.x) вместо использования Math.round()? - person Robyer; 26.10.2018