Dapatkan tingkat dan status baterai di Android


109

Bagaimana saya bisa mendapatkan level dan status baterai (dicolokkan, dikosongkan, diisi, dll.)? Saya meneliti dokumen pengembang dan saya menemukan kelas BatteryManager. Tapi itu tidak berisi metode apa pun, hanya konstanta. Bagaimana cara saya menggunakannya?


Setelah beberapa LEBIH meneliti, saya menemukan BatteryManager.EXTRA_LEVEL.
Mohit Deshpande

Periksa metode ini untuk mendapatkan persentase baterai di sini freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Jawaban:


124

Berikut adalah contoh kode yang menjelaskan cara mendapatkan informasi baterai.

Singkatnya, penerima siaran untuk ACTION_BATTERY_CHANGEDmaksud tersebut disiapkan secara dinamis, karena tidak dapat diterima melalui komponen yang dideklarasikan dalam manifes, hanya dengan mendaftarkannya secara eksplisit dengan 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
Tentang Intent.ACTION_BATTERY_CHANGED: Ini adalah siaran permanen yang berisi status pengisian daya, level, dan informasi lain tentang baterai. Anda tidak dapat menerima ini melalui komponen yang dideklarasikan dalam manifes, hanya dengan mendaftarkannya secara eksplisit dengan Context.registerReceiver ().
kelas Android

2
@classAndroid yah, ya, itu secara eksplisit dinyatakan dalam jawaban.
SirDarius

Ya @SirDarius, beri tahu orang lain tentangnya. Saya memuji jawaban Anda terlebih dahulu dan memberi komentar ini ketika saya mengetahuinya. :)
kelas Android

13
jangan lupa unRegisterReceiver onPause atau onDestroy.
Dave Doga Oz

Tidak dapat menginstal manajer baterai dengan Keywork baru, Mengapa Pak?
subhashchandru

102

Sejak API 21, dimungkinkan untuk menggunakan yang berikut ini untuk mendapatkan level baterai saat ini sebagai persentase:

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

65

Berdasarkan dokumen resmi Android , Anda dapat menggunakan metode ini di kelas Helper atau Util untuk mendapatkan persentase baterai saat ini:

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

satu kesalahan di dokumen resmi, Anda harus menggunakan double sebagai gantinya float 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) skala; int persen = (int) (batteryPct * 100D);
pengguna2212515

2
@ user2212515, maukah Anda mengedit jawaban saya berdasarkan dokumen resmi?
blueware

@ Ryan, saya mengedit jawaban saya untuk mendukung Android v21 dan yang lebih baru. Silakan periksa.
blueware

14

Anda tidak perlu mendaftarkan BroadcastReceiver yang sebenarnya karena BatteryManager Android menggunakan sticky Intent:

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

Ini dari dokumen resmi di https://developer.android.com/training/monitoring-device-state/battery-monitoring.html .


7

Anda dapat menggunakan ini untuk mendapatkan sisa tagihan dalam persentase.

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

coba fungsi ini tidak perlu izin atau penerima apa pun

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

Untuk memeriksa persentase baterai kami menggunakan BatteryManager , metode berikut akan mengembalikan persentase baterai.

Tautan Sumber

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

hei saya menggunakan ini dan kadang-kadang hasilnya adalah 89 kadang-kadang 00,89 itu bergerak desimal apa yang terjadi
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

satu kesalahan di dokumen resmi, Anda harus menggunakan double, bukan float. Karena 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);

Bukankah itu kesalahan 0.53F -> 52F yang disebabkan oleh casting nilai akhir ke int (sehingga menghilangkan nilai 0.x desimal darinya), daripada menggunakan Math.round ()?
Robyer

0

Jawaban lain tidak menyebutkan cara mengakses status baterai (mengamuk atau tidak).

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.