web-dev-qa-db-fra.com

Obtenez le niveau de la batterie avant que le récepteur de radiodiffusion ne réponde pour Intent.ACTION_BATTERY_CHANGED

J'ai un récepteur de diffusion dans mon programme pour réagir au niveau de la batterie, comme ceci:

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

Toutefois, ce code doit attendre que l'état de la batterie soit mis à jour. Par conséquent, si vous devez définir un élément de l'interface graphique en fonction du niveau de la batterie, il doit attendre qu'un événement de batterie se produise. Existe-t-il un moyen de calmer cela pour le faire fonctionner ou simplement d’exécuter du code pour voir quel était le niveau de charge de la batterie lors de la dernière diffusion?

41
stealthcopter

Y at-il un moyen de Nudge cela pour le faire fonctionner ou simplement exécuter un code pour voir ce que le niveau de la batterie était sur la dernière émission?

Vous pouvez appeler registerReceiver() avec votre IntentFilter et votre nullBroadcastReceiver pour obtenir la dernière variable Intent. Cela fonctionne parce que ACTION_BATTERY_CHANGED est une soi-disant "diffusion persistante", que je décris un peu plus dans cette question StackOverflow .

37
CommonsWare

Voici comment obtenir le niveau de la batterie sans enregistrer un récepteur:

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

Il peut utiliser un BroadcastReceiver nul en raison de la nature collante de la diffusion.

Il utilise l'astuce getApplicationContext () au cas où vous vous trouvez dans un destinataire d'intention et obtenez l'exception:

Android.content.ReceiverCallNotAllowedException: Les composants IntentReceiver ne sont pas autorisé à vous inscrire pour recevoir l'intention

82
isdal
    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) + "%";
    }
5
XXX
// 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));
}
2
Hiren Patel

J'utilise cette méthode pour obtenir le niveau de la batterie sans recevoir de mises à jour.

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

S'il vous plaît être conscient, que l'intention que vous obtenez de registerReceiver appel

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

peut être nul. Alors s'il vous plaît faire une vérification avant d'utiliser l'intention, par exemple.

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

Je viens de recevoir une exception de pointeur null, provoquant le blocage de l'application!

0
Johan