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?

Mohit Deshpande
sumber
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));
  }
}
SirDarius
sumber
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);
Menandai
sumber
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);
   }
}
blueware
sumber
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 .

bk138
sumber
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);
    }
reza.cse08
sumber
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)));
  }
milan pithadia
sumber
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;
}
Kode Spy
sumber
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);
    }
Hardip
sumber
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);
pengguna2212515
sumber
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;
FindOutIslamNow
sumber