Holen Sie sich Akkuladestand und Status in Android


109

Wie kann ich den Akkuladestand und -status ermitteln (eingesteckt, entladen, aufgeladen usw.)? Ich habe die Entwicklerdokumente recherchiert und eine BatteryManager-Klasse gefunden. Aber es enthält keine Methoden, nur Konstanten. Wie benutze ich es überhaupt?


Nach einigen weiteren Recherchen habe ich BatteryManager.EXTRA_LEVEL gefunden.
Mohit Deshpande

Überprüfen Sie diese Methode, um den Batterieprozentsatz hier zu erhalten. Freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Antworten:


124

In diesem Codebeispiel wird erläutert, wie Sie Informationen zur Batterie erhalten.

Zusammenfassend lässt sich sagen, dass ein Rundfunkempfänger für die ACTION_BATTERY_CHANGEDAbsicht dynamisch eingerichtet wird, da er nicht über Komponenten empfangen werden kann, die in Manifesten deklariert sind, sondern nur durch explizite Registrierung Context.registerReceiver().

public class Main extends Activity {
  private TextView batteryTxt;
  private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context ctxt, Intent intent) {
      int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
      batteryTxt.setText(String.valueOf(level) + "%");
    }
  };

  @Override
  public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.main);
    batteryTxt = (TextView) this.findViewById(R.id.batteryTxt);
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  }
}

2
Informationen zu Intent.ACTION_BATTERY_CHANGED: Dies ist eine Sticky-Sendung, die den Ladezustand, den Ladezustand und andere Informationen zum Akku enthält. Sie können dies nicht über Komponenten erhalten, die in Manifesten deklariert sind, sondern nur durch explizite Registrierung bei Context.registerReceiver ().
Klasse Android

2
@classAndroid gut, ja, das ist in der Antwort explizit angegeben.
SirDarius

Ja @SirDarius, nur um andere darüber zu informieren. Ich habe Ihre Antwort zuerst positiv bewertet und diesen Kommentar abgegeben, als ich ihn herausgefunden habe. :)
Klasse Android

13
Vergessen Sie nicht, den Empfänger bei Pause oder bei Zerstörung abzumelden.
Dave Doga Oz

Kann den Batteriemanager nicht mit neuem Keywork installieren. Warum Sir?
Subhashchandru

102

Seit API 21 ist es möglich, Folgendes zu verwenden, um den aktuellen Batteriestand als Prozentsatz zu ermitteln:

BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

65

Basierend auf offiziellen Android-Dokumenten können Sie diese Methode in einer Helper- oder Util-Klasse verwenden, um den aktuellen Batterieprozentsatz abzurufen:

public static int getBatteryPercentage(Context context) {

    if (Build.VERSION.SDK_INT >= 21) {

         BatteryManager bm = (BatteryManager) context.getSystemService(BATTERY_SERVICE);
         return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

    } else {

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

         int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
         int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;

         double batteryPct = level / (double) scale;

         return (int) (batteryPct * 100);
   }
}

Ein Fehler in offiziellen Dokumenten: Sie müssen double verwenden, anstatt float int level = batterieStatus! = null? batterieStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; int scale = batteriestatus! = null? batterieStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; doppelte BatteriePct = (doppelte) Stufe / (doppelte) Skala; int Prozent = (int) (BatteriePct * 100D);
user2212515

2
@ user2212515, würde es Ihnen etwas ausmachen, meine Antwort basierend auf den offiziellen Dokumenten zu bearbeiten?
Blueware

@ Ryan, ich habe meine Antwort bearbeitet, um Android v21 und höher zu unterstützen. Bitte probieren Sie es aus.
Blueware

14

Sie müssen keinen tatsächlichen BroadcastReceiver registrieren, da der BatteryManager von Android eine klebrige Absicht verwendet:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

return (int)(batteryPct*100);

Dies geht aus den offiziellen Dokumenten unter https://developer.android.com/training/monitoring-device-state/battery-monitoring.html hervor .


7

Sie können dies verwenden, um die verbleibende Gebühr in Prozent zu erhalten.

private void batteryLevel() {
        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                int level = -1;
                if (rawlevel >= 0 && scale > 0) {
                    level = (rawlevel * 100) / scale;
                }
                batterLevel.setText("Battery Level Remaining: " + level + "%");
            }
        };
        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReceiver, batteryLevelFilter);
    }

5

Versuchen Sie diese Funktion ohne Erlaubnis oder Empfänger

void getBattery_percentage()
{
      IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
      Intent batteryStatus = getApplicationContext().registerReceiver(null, ifilter);
      int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
      int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
      float batteryPct = level / (float)scale;
      float p = batteryPct * 100;

      Log.d("Battery percentage",String.valueOf(Math.round(p)));
  }

4

Um den Batterieprozentsatz zu überprüfen, verwenden wir BatteryManager . Die folgende Methode gibt den Batterieprozentsatz zurück.

Quelle Link -

public static float getBatteryLevel(Context context, Intent intent) {
    Intent batteryStatus = context.registerReceiver(null,
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int batteryLevel = -1;
    int batteryScale = 1;
    if (batteryStatus != null) {
        batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, batteryLevel);
        batteryScale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, batteryScale);
    }
    return batteryLevel / (float) batteryScale * 100;
}

Hey, ich habe das benutzt und manchmal ist das Ergebnis 89, manchmal ist es 00,89, es bewegt die Dezimalstellen, was passiert
Pemba Tamang

1
private void batteryLevel() {
        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int rawlevel = intent.getIntExtra("level", -1);
                int scale = intent.getIntExtra("scale", -1);
                int level = -1;
                if (rawlevel >= 0 && scale > 0) {
                    level = (rawlevel * 100) / scale;
                }
                mBtn.setText("Battery Level Remaining: " + level + "%");
            }
        };
        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReceiver, batteryLevelFilter);
    }

1

Ein Fehler in offiziellen Dokumenten: Sie müssen double anstelle von float verwenden. Weil 0,53F * 100F = 52F

int level = batteryStatus != null ? 
batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; int scale = 
batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; 
double batteryPct = (double) level / (double) scale; int percent = (int) (batteryPct * 100D);

Ist das nicht ein Fehler von 0,53F -> 52F, der durch das Umwandeln des Endwerts in int (wodurch jeder dezimale 0.x-Wert entfernt wird) verursacht wird, anstatt Math.round () zu verwenden?
Robyer

0

In anderen Antworten wurde nicht erwähnt, wie auf den Batteriestatus zugegriffen werden soll (zotteln oder nicht).

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

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.