Android'de pil seviyesini ve durumunu öğrenin


109

Pil seviyesini ve durumunu (prize takılı, boşalıyor, şarj oluyor, vb.) Nasıl öğrenebilirim? Geliştirici belgelerini araştırdım ve bir BatteryManager sınıfı buldum. Ancak herhangi bir yöntem içermez, sadece sabitler. Nasıl kullanırım?


DAHA FAZLA araştırmadan sonra BatteryManager.EXTRA_LEVEL'i buldum.
Mohit Deshpande

Pil yüzdesini burada öğrenmek
Code Spy

Yanıtlar:


124

İşte pil bilgilerinin nasıl alınacağını açıklayan bir kod örneği.

Özetlemek gerekirse, ACTION_BATTERY_CHANGEDniyet için bir yayın alıcısı dinamik olarak kurulur, çünkü manifestolarda bildirilen bileşenler aracılığıyla alınamaz, yalnızca açıkça kayıt yapılarak alınamaz 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
Intent.ACTION_BATTERY_CHANGED Hakkında: Bu, batarya ile ilgili şarj durumu, seviyesi ve diğer bilgileri içeren yapışkan bir yayındır. Bunu, bildirimlerde bildirilen bileşenler aracılığıyla, yalnızca Context.registerReceiver () ile açıkça kaydolarak alamazsınız.
sınıf Android

2
@classAndroid iyi, evet, bu açıkça cevapta belirtilmiştir.
SirDarius

Evet @ SirDarius, sadece başkalarının bilmesini sağlayın. Önce cevabınızı oyladım ve bulduğumda bu yorumu koydum. :)
sınıf Android

14
Duraklat veya OnDestroy'da Kayıtlı Alıcının kaydını silmeyi unutmayın.
Dave Doğa Öz

Pil yöneticisi yeni Keywork ile kurulamıyor, Neden efendim?
subhashchandru


66

Resmi android belgelerine dayanarak, mevcut pil yüzdesini almak için bu yöntemi bir Helper veya Util sınıfında kullanabilirsiniz:

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

resmi belgelerde bir hata, float yerine double kullanmanız gerekir int level = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; int scale = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; double batteryPct = (çift) seviye / (çift) ölçek; int yüzde = (int) (batteryPct * 100D);
user2212515

2
@ user2212515, cevabımı resmi belgelere göre düzenler misiniz?
blueware

@Ryan, cevabımı android v21 ve sonraki sürümleri desteklemek için düzenledim. Lütfen kontrol et.
blueware

14

Android'in BatteryManager'ı yapışkan bir Amaç kullandığından gerçek bir BroadcastReceiver kaydetmeniz gerekmez:

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

Bu, https://developer.android.com/training/monitoring-device-state/battery-monitoring.html adresindeki resmi belgelerden alınmıştır .


7

Yüzde olarak kalan ücretlendirilmek için bunu kullanabilirsiniz.

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

bu işlevi deneyin izne veya alıcıya gerek yok

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

Pil yüzdesini kontrol etmek için BatteryManager kullanıyoruz , aşağıdaki yöntem pil yüzdesini döndürecektir.

Kaynak Bağlantısı

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 bunu kullandım ve bazen sonuç 89, bazen 00.89, ondalık sayıları hareket ettiriyor
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

resmi belgelerdeki bir hata, float yerine double kullanmalısınız. Çünkü 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);

Bu 0.53F -> 52F hatası Math.round () kullanmak yerine nihai değerin int'e çevrilmesi (dolayısıyla ondalık 0.x değerinin çıkarılması) değil midir?
Robyer

0

Diğer cevaplar pil durumuna nasıl erişileceğinden bahsetmedi (chraging veya değil).

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.