Obtén nivel de batería y estado en Android

¿Cómo puedo obtener el nivel y el estado de la batería (enchufado, descargando, 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?

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

Para resumir, un receptor de difusión para el bash ACTION_BATTERY_CHANGED se configura dinámicamente, porque no se puede recibir a través de componentes declarados en manifiestos, solo registrándolo 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)); } } 

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

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

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

 public static int getBatteryPercentage(Context context) { 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; float batteryPct = level / (float) scale; return (int) (batteryPct * 100); } 

No tiene que registrar un BroadcastReceiver real ya que BatteryManager de Android está usando un Intento adhesivo:

 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 .

Puede usar esto para obtener el cargo restante 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); } 

Después de investigar MÁS, encontré BatteryManager.EXTRA_LEVEL.

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

un error en los documentos oficiales, debe usar el 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);