รับระดับแบตเตอรี่และสถานะใน Android


109

ฉันจะรับระดับและสถานะแบตเตอรี่ได้อย่างไร (เสียบปลั๊กไฟกำลังชาร์จ ฯลฯ ) ฉันค้นคว้าเอกสารของนักพัฒนาและพบคลาส BatteryManager แต่มันไม่มีเมธอดใด ๆ เพียงแค่ค่าคงที่ ฉันจะใช้มันได้อย่างไร?


หลังจากค้นคว้าเพิ่มเติมฉันพบ BatteryManager.EXTRA_LEVEL
Mohit Deshpande

ตรวจสอบวิธีนี้เพื่อรับเปอร์เซ็นต์แบตเตอรี่ที่นี่freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

คำตอบ:


124

นี่คือตัวอย่างโค้ดที่อธิบายวิธีรับข้อมูลแบตเตอรี่

สรุปได้ว่าเครื่องรับสัญญาณออกอากาศสำหรับACTION_BATTERY_CHANGEDความตั้งใจจะถูกตั้งค่าแบบไดนามิกเนื่องจากไม่สามารถรับผ่านส่วนประกอบที่ประกาศในรายการได้โดยการลงทะเบียนอย่างชัดเจนด้วย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: นี่คือการออกอากาศแบบติดหนึบที่มีสถานะการชาร์จระดับและข้อมูลอื่น ๆ เกี่ยวกับแบตเตอรี่ คุณไม่สามารถรับสิ่งนี้ผ่านส่วนประกอบที่ประกาศในรายการ Manifest โดยการลงทะเบียนอย่างชัดเจนด้วย Context.registerReceiver ()
คลาส Android

2
@classAndroid ใช่ที่ระบุไว้อย่างชัดเจนในคำตอบ
SirDarius

ใช่ @SirDarius เพียงแค่บอกให้คนอื่นรู้เรื่องนี้ ฉันเพิ่มคะแนนคำตอบของคุณก่อนและแสดงความคิดเห็นนี้เมื่อฉันพบ :)
คลาส Android

13
อย่าลืม unRegisterReceiver onPause หรือ onDestroy
Dave Doga Oz

ไม่สามารถติดตั้งตัวจัดการแบตเตอรี่ด้วย Keywork ใหม่ได้ทำไม?
subhashchandru

102

เนื่องจาก API 21 เป็นไปได้ที่จะใช้สิ่งต่อไปนี้เพื่อรับระดับแบตเตอรี่ปัจจุบันเป็นเปอร์เซ็นต์:

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

66

จากเอกสารอย่างเป็นทางการของ Androidคุณสามารถใช้วิธีนี้ในคลาส Helper หรือ Util เพื่อรับเปอร์เซ็นต์แบตเตอรี่ปัจจุบัน:

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

ข้อผิดพลาดอย่างหนึ่งในเอกสารอย่างเป็นทางการคุณต้องใช้ double แทน 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) scale; int เปอร์เซ็นต์ = (int) (batteryPct * 100D);
user2212515

2
@ user2212515 คุณช่วยแก้ไขคำตอบของฉันตามเอกสารทางการได้ไหม
blueware

@Ryan ฉันแก้ไขคำตอบเพื่อรองรับ android v21 และใหม่กว่า โปรดตรวจสอบ
blueware

14

คุณไม่จำเป็นต้องลงทะเบียน BroadcastReceiver จริงเนื่องจาก BatteryManager ของ Android ใช้ 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);

นี้เป็นจากเอกสารอย่างเป็นทางการมากกว่าที่https://developer.android.com/training/monitoring-device-state/battery-monitoring.html


7

คุณสามารถใช้สิ่งนี้เพื่อเรียกเก็บเงินส่วนที่เหลือเป็นเปอร์เซ็นต์

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

ลองใช้ฟังก์ชั่นนี้ไม่จำเป็นต้องมีสิทธิ์หรือผู้รับใด ๆ

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

ในการตรวจสอบเปอร์เซ็นต์แบตเตอรี่เราใช้BatteryManagerวิธีการต่อไปนี้จะคืนเปอร์เซ็นต์แบตเตอรี่

ลิงค์ที่มา

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

เฮ้ฉันใช้สิ่งนี้และบางครั้งผลลัพธ์ก็คือ 89 บางครั้งมันก็ 00.89 มันกำลังเคลื่อนทศนิยมว่าเกิดอะไรขึ้น
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

ข้อผิดพลาดอย่างหนึ่งในเอกสารทางการคุณต้องใช้ double แทน float เพราะ 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);

ความผิดพลาด 0.53F -> 52F นั้นไม่ได้เกิดจากการร่ายค่าสุดท้ายเป็น int (ดังนั้นจึงตัดค่าทศนิยม 0.x ออกจากมัน) แทนที่จะใช้ Math.round ()?
Robyer

0

คำตอบอื่น ๆ ไม่ได้กล่าวถึงวิธีการเข้าถึงสถานะแบตเตอรี่ (chraging หรือไม่)

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.