Obtenez le niveau de la batterie avant récepteur de radiodiffusion répond pour Intent.ACTION_BATTERY_CHANGED

StackOverflow https://stackoverflow.com/questions/3661464

Question

J'ai un récepteur de radiodiffusion dans mon programme pour obtenir 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 l'état de la batterie soit mise à jour si vous avez un élément graphique qui doit être réglé en fonction du niveau de la batterie, il doit attendre un événement de la batterie de se produire. Est-il un moyen de pousser cela pour le faire fonctionner ou simplement exécuter du code pour voir ce que le niveau de la batterie était la dernière émission?

Était-ce utile?

La solution

  

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

Vous pouvez appeler registerReceiver() avec votre IntentFilter et un null de BroadcastReceiver pour obtenir la Intent dernière diffusion. Cela fonctionne parce que ACTION_BATTERY_CHANGED est un soi-disant « émission collante », que je décris un peu plus dans ce StackOverflow questions-réponse .

Autres conseils

Voici comment obtenir le niveau de la batterie sans enregistrement d'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 une BroadcastReceiver nulle en raison de la nature collante de l'émission.

Il utilise l'astuce getApplicationContext () dans le cas où vous êtes dans un récepteur intention et obtenez l'exception:

  

android.content.ReceiverCallNotAllowedException:   composants IntentReceiver ne sont pas   autorisé à vous inscrire pour recevoir   intentions

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

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

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

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

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

peut être nulle. Alors, s'il vous plaît faire un chèque avant d'utiliser l'intention, par exemple.

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

Je viens de recevoir une exception de pointeur nul, ce qui provoque l'application crash!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top