Obtener el nivel y el estado de la batería en Android

109

¿Cómo puedo obtener el nivel y el estado de la batería (enchufado, descargándose, cargando, etc.)? Investigué los documentos del desarrollador y encontré una clase BatteryManager. Pero no contiene ningún método, solo constantes. ¿Cómo lo uso?

Mohit Deshpande
fuente
Después de investigar MÁS, encontré BatteryManager.EXTRA_LEVEL.
Mohit Deshpande
Verifique este método para obtener el porcentaje de batería aquí freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Respuestas:

124

Aquí hay un ejemplo de código que explica cómo obtener información sobre la batería.

En resumen, un receptor de difusión para la ACTION_BATTERY_CHANGEDintención se configura dinámicamente, porque no se puede recibir a través de componentes declarados en los manifiestos, solo registrándose explícitamente con 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
fuente
2
Acerca de Intent.ACTION_BATTERY_CHANGED: esta es una transmisión fija que contiene el estado de carga, el nivel y otra información sobre la batería. No puede recibir esto a través de componentes declarados en manifiestos, solo registrándose explícitamente con Context.registerReceiver ().
clase Android
2
@classAndroid bueno, sí, eso se indica explícitamente en la respuesta.
SirDarius
Sí @SirDarius, solo haciéndolo saber a otros. Primero voté a favor de tu respuesta y puse este comentario cuando lo descubrí. :)
clase Android
13
no te olvides de anular el registro del receptor en la pausa o en la destrucción.
Dave Doga Oz
No se puede instalar el administrador de batería con un nuevo Keywork, ¿por qué señor?
subhashchandru
102

Desde API 21, ha sido posible utilizar lo siguiente para obtener el nivel actual de la batería como porcentaje:

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

Según los documentos oficiales de Android , puede usar este método en una clase Helper o Util para obtener el porcentaje de batería actual:

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
fuente
un error en los documentos oficiales, debe usar double en lugar de flotar int level = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; int scale = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; double batteryPct = (doble) nivel / (doble) escala; int porcentaje = (int) (batteryPct * 100D);
user2212515
2
@ user2212515, ¿te importaría editar mi respuesta según los documentos oficiales?
blueware
@Ryan, edité mi respuesta para que sea compatible con Android v21 y versiones posteriores. Por favor, míralo.
blueware
14

No es necesario que registre un BroadcastReceiver real, ya que BatteryManager de Android utiliza un Intent pegajoso:

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

Esto es de los documentos oficiales en https://developer.android.com/training/monitoring-device-state/battery-monitoring.html .

bk138
fuente
7

Puede usar esto para cobrar el resto en porcentaje.

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
fuente
5

prueba esta función sin necesidad de permiso ni ningún 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)));
  }
milán pithadia
fuente
4

Para verificar el porcentaje de batería usamos BatteryManager , el siguiente método devolverá el porcentaje de batería.

Enlace de origen

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;
}
Código espía
fuente
oye, usé esto y, a veces, el resultado es 89, a veces es 00.89, está moviendo los decimales, ¿qué está pasando?
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
fuente
1

un error en los documentos oficiales, debe usar doble en lugar de flotar. 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);
usuario2212515
fuente
¿No es ese error de 0.53F -> 52F causado por lanzar el valor final a int (así eliminando cualquier valor decimal 0.x de él), en lugar de usar Math.round ()?
Robyer
0

Otras respuestas no mencionaron cómo acceder al estado de la batería (cargando o no).

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
fuente