41 votes

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 avez un élément d'interface graphique à configurer en fonction du niveau de la batterie, vous devez attendre qu'un événement de batterie se produise. Existe-t-il un moyen de faire bouger les choses pour que cela fonctionne ou tout simplement d'exécuter du code pour voir quel était le niveau de charge de la batterie lors de la dernière diffusion?

84voto

isdal Points 531

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("level", -1);
double scale = batteryIntent.getIntExtra("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 êtes dans un récepteur d'intention et obtenez l'exception:

android.content.ReceiverCallNotAllowedException: les composants IntentReceiver ne sont pas autorisés à s'inscrire pour recevoir des intentions

37voto

CommonsWare Points 402670

Est-il un moyen de coup de pouce pour l'obtenir de travail ou tout simplement exécuter du code pour voir ce que le niveau de la batterie est sur la dernière émission?

Vous pouvez appeler registerReceiver() votre IntentFilter et null BroadcastReceiver pour obtenir la dernière diffusion Intent. Cela fonctionne parce qu' ACTION_BATTERY_CHANGED est un soi-disant "collante émission", qui je décris un peu plus dans cette StackOverflow de questions-réponses.

5voto

Zaur Points 3277
    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) + "%";
    }

2voto

user2757064 Points 732
// 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));
}

1voto

Elenasys Points 23268

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X