在Android中获取电池电量和状态

Moh*_*nde 95 java android battery

如何获得电池电量和状态(插入,放电,充电等)?我研究了开发人员文档,然后找到了一个BatteryManager类.但它不包含任何方法,只包含常量.我怎么用呢?

Sir*_*ius 117

是一个代码示例,解释了如何获取电池信息.

总结一下,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));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记unRegisterReceiver onPause或onDestroy. (12认同)
  • 关于 Intent.ACTION_BATTERY_CHANGED:这是一个包含充电状态、电量和其他有关电池信息的粘性广播。您无法通过清单中声明的​​组件接收此信息,只能通过使用 Context.registerReceiver() 显式注册它。 (2认同)
  • @classAndroid好,是的,答案中明确说明了这一点. (2认同)

Mar*_*ark 89

从API 21开始,可以使用以下内容将当前电池电量作为百分比:

BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
Run Code Online (Sandbox Code Playgroud)


blu*_*are 53

基于官方的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);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • @ user2212515,您介意根据官方文档编辑我的答案吗? (2认同)

bk1*_*138 11

您不必注册实际的BroadcastReceiver,因为Android的BatteryManager使用粘性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);
Run Code Online (Sandbox Code Playgroud)

这来自https://developer.android.com/training/monitoring-device-state/battery-monitoring.html上的官方文档.


rez*_*e08 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);
    }
Run Code Online (Sandbox Code Playgroud)


mil*_*dia 5

尝试此功能不需要许可或任何reciver

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)));
  }
Run Code Online (Sandbox Code Playgroud)


Fin*_*Now 5

其他答案没有提到如何访问电池状态(充电与否)。

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;
Run Code Online (Sandbox Code Playgroud)

  • 终于有人回答有关电池状态的问题了 (3认同)