Obtenga el nivel de batería antes de que el receptor de broadcast responda por Intent.ACTION_BATTERY_CHANGED

Tengo un receptor de transmisión en mi progtwig para reactjsr al nivel de la batería de la siguiente manera:

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context arg0, Intent intent) { int level = intent.getIntExtra("level", 0); // do something... } } registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

Sin embargo, este código tiene que esperar a que se actualice el estado de la batería, de modo que si tiene un elemento de GUI que debe establecerse en función del nivel de la batería, debe esperar a que ocurra un evento de batería. ¿Hay alguna manera de empujar esto para que funcione o simplemente ejecutar algún código para ver cuál era el nivel de batería en la última emisión?

¿Hay alguna manera de empujar esto para que funcione o simplemente ejecutar algún código para ver cuál era el nivel de batería en la última emisión?

Puede llamar registerReceiver() con su IntentFilter y un BroadcastReceiver null para obtener la Intent la última transmisión. Esto funciona porque ACTION_BATTERY_CHANGED es una llamada “emisión adhesiva”, que describo un poco más en esta pregunta y respuesta de StackOverflow .

Esta es la forma de obtener el nivel de batería sin registrar un receptor:

 Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); double scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); double level = -1; if (rawlevel >= 0 && scale > 0) { level = rawlevel / scale; } 

Puede utilizar un BroadcastReceiver nulo debido a la naturaleza pegajosa de la transmisión.

Utiliza el truco getApplicationContext () en caso de que esté en un receptor intencionado y obtenga la excepción:

android.content.ReceiverCallNotAllowedException: los componentes de IntentReceiver no pueden registrarse para recibir intenciones

  public static String batteryLevel(Context context) { Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); int percent = (level*100)/scale; return String.valueOf(percent) + "%"; } 
 // Put this Code into your MainActivity private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context c, Intent i) { int level = i.getIntExtra("level", 0); ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar); pb.setProgress(level); TextView tv = (TextView) findViewById(R.id.textfield); tv.setText("Battery Level: " + Integer.toString(level) + "%"); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); registerReceiver(mBatInfoReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED)); } 

Utilizo este método para obtener el nivel de batería sin recibir actualizaciones.

 public float getMyBatteryLevel() { Intent batteryIntent = this.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); return batteryIntent.getIntExtra("level", -1); } 

Tenga en cuenta que la intención que obtiene de registerReceiver call

 Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

puede ser nulo Por lo tanto, compruebe antes de usar el bash, por ejemplo

 if(intent != null){ // do your stuff here... } 

Acabo de recibir una excepción de puntero nulo, ¡y la aplicación se cuelga!