2010-07-20 22 views
54

¿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?Obtener nivel de batería y estado en Android

Respuesta

78

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

En resumen, un receptor de difusión para el intento 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)); 
    } 
} 
+1

Acerca de Intent.ACTION_BATTERY_CHANGED: Esta es una emisión adhesiva 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(). –

+0

@classAndroid Bueno, sí, eso está explícitamente establecido en la respuesta. – SirDarius

+0

Sí @SirDarius, solo para que otros lo sepan. Levanto tu respuesta primero y pongo este comentario cuando lo descubrí. :) –

2

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

+9

favor explicar cómo hacer uso de ella. – phreakhead

5

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

Desde API 21 de su sido posible utilizar estos procedimientos 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); 
4

Usted no tiene que registrar una BroadcastReceiver real, BatteryManager de Android es utilizando una pegajosa Intención:

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 a partir de los documentos oficiales sobre al https://developer.android.com/training/monitoring-device-state/battery-monitoring.html.

+0

simplemente use 'level', no necesita escala, etc. –

17

Basado en official android docs, puede utilizar este método en una clase o ayudante Util para obtener el porcentaje actual de la batería:

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