Obtenha o nível e o estado da bateria no Android

109

Como posso obter o nível e o estado da bateria (conectada, descarregando, carregando, etc)? Eu pesquisei os documentos do desenvolvedor e encontrei uma classe BatteryManager. Mas não contém nenhum método, apenas constantes. Como faço para usar?

Mohit Deshpande
fonte
Após MAIS pesquisas, encontrei BatteryManager.EXTRA_LEVEL.
Mohit Deshpande de
Verifique este método para obter a porcentagem da bateria aqui freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Respostas:

124

Aqui está um exemplo de código que explica como obter informações sobre a bateria.

Resumindo, um receptor de broadcast para a ACTION_BATTERY_CHANGEDintenção é configurado dinamicamente, porque não pode ser recebido por meio de componentes declarados em manifestos, apenas registrando-se explicitamente com 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));
  }
}
SirDarius
fonte
2
Sobre Intent.ACTION_BATTERY_CHANGED: Esta é uma transmissão persistente que contém o estado de carregamento, o nível e outras informações sobre a bateria. Você não pode receber isso por meio de componentes declarados em manifestos, apenas registrando-se explicitamente com Context.registerReceiver ().
classe Android
2
@classAndroid bem, sim, isso é explicitamente declarado na resposta.
SirDarius
Sim @SirDarius, apenas avisando os outros sobre isso. Votei positivamente em sua resposta primeiro e fiz este comentário quando descobri. :)
classe Android
13
não se esqueça de cancelarRegisterReceiver onPause ou onDestroy.
Dave Doga Oz
Impossível inicializar o gerenciador de bateria com o novo Keywork, por que senhor?
subhashchandru
102

Desde a API 21, é possível usar o seguinte para obter o nível atual da bateria como uma porcentagem:

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

Com base nos documentos oficiais do Android , você pode usar este método em uma classe Helper ou Util para obter a porcentagem atual da bateria:

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);
   }
}
blueware
fonte
um erro nos documentos oficiais, você deve usar double em vez de float int level = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; escala int = bateriaStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; bateria duplaPct = nível (duplo) / escala (dupla); porcentagem int = (int) (bateriaPct * 100D);
user2212515
2
@ user2212515, você se importaria de editar minha resposta com base nos documentos oficiais?
blueware de
@Ryan, editei minha resposta para oferecer suporte ao Android v21 e posterior. Por favor, confira.
blueware de
14

Você não precisa registrar um BroadcastReceiver real, pois o BatteryManager do Android está usando um Intent fixo:

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

Esta é a documentação oficial em https://developer.android.com/training/monitoring-device-state/battery-monitoring.html .

bk138
fonte
7

Você pode usar isso para obter o restante cobrado em porcentagem.

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);
    }
reza.cse08
fonte
5

tente esta função sem necessidade de permissão ou qualquer receptor

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)));
  }
milan pithadia
fonte
4

Para verificar a porcentagem da bateria, usamos o BatteryManager , o método a seguir retorna a porcentagem da bateria.

Link da fonte

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;
}
Code Spy
fonte
Ei eu usei isso e às vezes o resultado é 89 às vezes é 00.89 é movendo os decimais o que está acontecendo
Pemba Tamang
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);
    }
Hardip
fonte
1

um erro nos documentos oficiais, você deve usar double em vez de float. Porque 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);
user2212515
fonte
Esse erro de 0,53F -> 52F não é causado pela conversão do valor final em int (removendo qualquer valor decimal 0.x dele), em vez de usar Math.round ()?
Robyer
0

Outras respostas não mencionaram como acessar o status da bateria (chraging ou não).

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;
FindOutIslamNow
fonte