Ladezustand der Batterie, bevor Rundfunkempfänger antwortet für Intent.ACTION_BATTERY_CHANGED

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

Frage

Ich habe einen Rundfunkempfänger in meinem Programm reagieren wie so auf den Ladezustand der Batterie zu erhalten:

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

Doch dieser Code für den Batteriestatus warten muss, so aktualisiert werden, wenn Sie ein GUI-Element haben, dass der Bedarf auf der Grundlage der Batteriestand eingestellt werden, um es für eine Batterie Ereignis auftreten muss warten. Gibt es eine Möglichkeit, dies stupsen sie zum Laufen zu bringen oder einfach etwas Code ausführen, um zu sehen, was der Akkustand auf der letzte Sendung war?

War es hilfreich?

Lösung

Gibt es eine Möglichkeit, dies stupsen sie zum Laufen zu bringen oder einfach etwas Code ausführen, um zu sehen, was der Akkustand war auf die letzte Sendung?

Sie können registerReceiver() mit Ihrem IntentFilter anrufen und eine null BroadcastReceiver die zuletzt Sendung Intent zu bekommen. Dies funktioniert, weil ACTION_BATTERY_CHANGED ist eine sogenannte „sticky-Sendung“, die ich ein bisschen mehr in diese Frage Stackoverflow-und-Antwort-.

Andere Tipps

Dies ist, wie der Ladezustand der Batterie zu erhalten, ohne einen Empfänger Registrierung:

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 ein Null-BroadcastReceiver verwenden wegen der klebrigen Natur der Sendung.

Es nutzt den getApplicationContext () Trick, falls Sie in einer Absicht Empfänger sind und die Ausnahme erhalten:

android.content.ReceiverCallNotAllowedException: IntentReceiver Komponenten nicht registrieren erlaubt zu erhalten Absichten

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

Ich benutze diese Methode den Ladezustand der Batterie 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);
}

Bitte beachten Sie, dass die Absicht Sie von registerReceiver Anruf erhalten

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

kann null sein. Also bitte einen Scheck, bevor die Absicht verwenden, z.

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

Ich habe gerade eine Null-Zeiger Ausnahme bekomme, so dass der App zum Absturz zu bringen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top