Uzyskaj poziom i stan baterii w systemie Android

109

Jak mogę sprawdzić poziom i stan baterii (podłączony, rozładowany, ładowany itp.)? Przeszukałem dokumentację programisty i znalazłem klasę BatteryManager. Ale nie zawiera żadnych metod, tylko stałe. Jak go w ogóle używać?

Mohit Deshpande
źródło
Po WIĘCEJ poszukiwań znalazłem BatteryManager.EXTRA_LEVEL.
Mohit Deshpande
Sprawdź tę metodę, aby uzyskać procent baterii tutaj freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Odpowiedzi:

124

Oto przykładowy kod, który wyjaśnia, jak uzyskać informacje o baterii.

Podsumowując, odbiornik rozgłoszeniowy ACTION_BATTERY_CHANGEDintencji jest konfigurowany dynamicznie, ponieważ nie można go odebrać za pośrednictwem komponentów zadeklarowanych w manifestach, a jedynie poprzez jawną rejestrację w 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));
  }
}
Sir Darius
źródło
2
About Intent.ACTION_BATTERY_CHANGED: To jest przyklejona transmisja zawierająca stan naładowania, poziom i inne informacje o baterii. Nie można tego uzyskać za pośrednictwem komponentów zadeklarowanych w manifestach, tylko poprzez jawną rejestrację za pomocą Context.registerReceiver ().
zajęcia Android
2
@classAndroid cóż, tak, jest to wyraźnie określone w odpowiedzi.
SirDarius
Tak, @SirDarius, po prostu informując innych o tym. Najpierw zagłosowałem za twoją odpowiedzią i umieściłem ten komentarz, kiedy się dowiedziałem. :)
klasa Android
14
nie zapomnij wyrejestrowaćRegisterReceiver onPause lub onDestroy.
Dave Doga Oz
Nie można zainstalować menedżera baterii za pomocą nowego Keywork. Dlaczego proszę pana?
subhashchandru
105

Ponieważ SDK 21 LOLLIPOPmożliwe jest użycie następujących wartości, aby uzyskać aktualny poziom naładowania baterii w procentach:

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

Przeczytaj BatteryManager | Programiści Androida - BATTERY_PROPERTY_CAPACITY

znak
źródło
66

W oparciu o oficjalną dokumentację systemu Android możesz użyć tej metody w klasie pomocniczej lub użytkowej, aby uzyskać bieżący procent baterii:

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);
   }
}
blueware
źródło
jeden błąd w oficjalnej dokumentacji, musisz użyć double zamiast float int level = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; int scale = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; podwójna bateriaPct = (podwójny) poziom / (podwójna) skala; int percent = (int) (batteryPct * 100D);
user2212515
2
@ user2212515, czy mógłbyś edytować moją odpowiedź na podstawie oficjalnej dokumentacji?
blueware
@Ryan, zredagowałem odpowiedź, aby obsługiwać Androida w wersji 21 i nowszej. Proszę sprawdź to.
blueware
14

Nie musisz rejestrować rzeczywistego BroadcastReceiver, ponieważ BatteryManager Androida używa lepkiej intencji:

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

To pochodzi z oficjalnej dokumentacji na https://developer.android.com/training/monitoring-device-state/battery-monitoring.html .

bk138
źródło
7

Możesz użyć tego, aby uzyskać pozostałą opłatę w procentach.

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);
    }
reza.cse08
źródło
5

spróbuj tej funkcji nie ma potrzeby permisson ani żadnego odbiornika

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)));
  }
milan pithadia
źródło
4

Aby sprawdzić procent baterii, używamy BatteryManager , poniższa metoda zwróci procent baterii.

Link do źródła

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;
}
Code Spy
źródło
hej, użyłem tego i czasami wynik to 89, czasami jego 00.89 to przesunięcie ułamków dziesiętnych, co się dzieje
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);
    }
Hardip
źródło
1

jeden błąd w oficjalnych dokumentach, musisz użyć double zamiast float. Ponieważ 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);
user2212515
źródło
Czy to nie błąd 0.53F -> 52F spowodowany rzutowaniem wartości końcowej na int (w ten sposób usuwając z niej jakąkolwiek wartość dziesiętną 0.x) zamiast używania Math.round ()?
Robyer
0

Inne odpowiedzi nie wspominały, jak uzyskać dostęp do stanu baterii (chraging lub nie).

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;
FindOutIslamNow
źródło