Nhận mức pin và trạng thái trong Android


109

Làm cách nào tôi có thể nhận được mức và trạng thái của pin (cắm vào, xả, sạc, v.v.)? Tôi đã nghiên cứu tài liệu dành cho nhà phát triển và tôi đã tìm thấy một lớp BatteryManager. Nhưng nó không chứa bất kỳ phương thức nào, chỉ là hằng số. Làm thế nào để tôi thậm chí sử dụng nó?


Sau một số nghiên cứu THÊM, tôi đã tìm thấy BatteryManager.EXTRA_LEVEL.
Mohit Deshpande

Kiểm tra phương pháp này để nhận phần trăm pin tại đây freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Câu trả lời:


124

Đây là mẫu mã giải thích cách lấy thông tin về pin.

Tóm lại, bộ thu phát sóng cho ACTION_BATTERY_CHANGEDý định được thiết lập động, vì nó không thể được nhận thông qua các thành phần được khai báo trong tệp kê khai, chỉ bằng cách đăng ký rõ ràng cho nó với 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
Giới thiệu về Intent.ACTION_BATTERY_CHANGED: Đây là chương trình phát cố định chứa trạng thái sạc, mức độ và thông tin khác về pin. Bạn không thể nhận điều này thông qua các thành phần được khai báo trong tệp kê khai, chỉ bằng cách đăng ký rõ ràng cho nó với Context.registerReceiver ().
lớp học Android

2
@classAndroid tốt, vâng, điều đó được nêu rõ ràng trong câu trả lời.
SirDarius

Có @SirDarius, chỉ để người khác biết về nó. Tôi đã ủng hộ câu trả lời của bạn trước tiên và đưa nhận xét này khi tôi phát hiện ra nó. :)
lớp Android

13
đừng quên bỏRegisterReceiver onPause hoặc onDestroy.
Dave Doga Oz

Không thể cài đặt trình quản lý pin bằng Keywork mới, tại sao thưa ông?
subhashchandru

102

Kể từ API 21, bạn có thể sử dụng thông tin sau để nhận mức pin hiện tại dưới dạng phần trăm:

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

65

Dựa trên tài liệu Android chính thức , bạn có thể sử dụng phương pháp này trong lớp Trợ giúp hoặc Util để nhận phần trăm pin hiện tại:

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

một sai lầm trong tài liệu chính thức, bạn phải sử dụng double thay thế float int level = pinStatus! = null? pinStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; int scale = batteryStatus! = null? pinStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; double pinPct = (gấp đôi) mức / (gấp đôi) thang đo; int phần trăm = (int) (pinPct * 100D);
user2212515

2
@ user2212515, bạn có phiền chỉnh sửa câu trả lời của tôi dựa trên tài liệu chính thức không?
blueware

@Ryan, tôi đã chỉnh sửa câu trả lời của mình để hỗ trợ android v21 trở lên. Làm ơn hãy kiểm tra nó.
blueware,

14

Bạn không cần phải đăng ký BroadcastReceiver thực tế vì BatteryManager của Android đang sử dụng Intent cố định:

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

Đây là từ các tài liệu chính thức tại https://developer.android.com/training/monitoring-device-state/battery-monitoring.html .


7

Bạn có thể sử dụng điều này để được tính phí theo phần trăm còn lại.

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

hãy thử chức năng này mà không cần sự cho phép hoặc bất kỳ người nhận nào

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

Để kiểm tra phần trăm pin, chúng tôi sử dụng BatteryManager , phương pháp sau sẽ trả về phần trăm pin.

Liên kết nguồn

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 tôi đã sử dụng này và đôi khi kết quả là là 89 đôi khi nó 00,89 của nó di chuyển số thập phân whats xảy ra
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

một sai lầm trong tài liệu chính thức, bạn phải sử dụng double thay vì float. Bởi vì 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);

Đó không phải là lỗi 0,53F -> 52F do ép giá trị cuối cùng thành int (do đó loại bỏ bất kỳ giá trị 0.x thập phân nào khỏi nó), thay vì sử dụng Math.round ()?
Robyer

0

Các câu trả lời khác không đề cập đến cách truy cập trạng thái pin (đang phân loại hay không).

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.