it-swarm.com.de

Erhalten Sie den Akkuladestand, bevor der Broadcast-Empfänger für Intent.ACTION_BATTERY_CHANGED antwortet

Ich habe einen Rundfunkempfänger in meinem Programm, um wie folgt auf den Akkuladestand zu reagieren:

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

Dieser Code muss jedoch auf die Aktualisierung des Batteriestatus warten. Wenn Sie ein GUI-Element haben, das basierend auf dem Batteriestand eingestellt werden muss, muss es auf das Auftreten eines Batterieereignisses warten. Gibt es eine Möglichkeit, dies anzuschieben, um es zum Laufen zu bringen, oder einfach Code ausführen, um zu sehen, wie der Akkuladestand bei der letzten Sendung war?

41
stealthcopter

Gibt es eine Möglichkeit, dies anzuschieben, um es zum Laufen zu bringen, oder führen Sie einfach einen Code aus, um zu sehen, wie der Akkuladestand war die letzte Sendung?

Sie können registerReceiver() mit Ihrer IntentFilter und einer nullBroadcastReceiver aufrufen, um das letzte Broadcast Intent abzurufen. Das funktioniert, weil ACTION_BATTERY_CHANGED ein sogenannter "sticky broadcast" ist, den ich in diesem StackOverflow-Frage-und-Antwort etwas näher beschreibe.

37
CommonsWare

So erhalten Sie den Akkuladestand, ohne einen Empfänger zu registrieren:

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

Es kann einen BroadcastReceiver mit Nullwert verwenden, da die Übertragung stört.

Es verwendet den getApplicationContext () - Trick, falls Sie sich in einem Empfänger mit Absicht befinden und die Ausnahme erhalten:

Android.content.ReceiverCallNotAllowedException: IntentReceiver-Komponenten sind nicht darf sich registrieren um beabsichtigt

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

Ich verwende diese Methode, um den Akkustand zu erhalten, ohne Updates zu erhalten.

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

Bitte beachten Sie, dass die Absicht, die Sie von registerReceiver erhalten, angerufen wird

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

kann null sein. Machen Sie daher bitte einen Check, bevor Sie die Absicht verwenden, z.

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

Ich habe gerade eine Nullzeiger-Ausnahme erhalten, die zum Absturz der App führte!

0
Johan