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?


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

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

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

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 .


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

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

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

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

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

¿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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.