Ladezustand der Batterie, bevor Rundfunkempfänger antwortet für Intent.ACTION_BATTERY_CHANGED
-
01-10-2019 - |
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?
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!