android 电量相关APi

一.通过广播获取到的信息

IntentFilter filter2 = new IntentFilter();
filter2.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(filter2,receiver);
接收到广播后,用getIntExtra("level")和getIntExtra("scale")获得相应值
intent.getIntExtra("level", 0);    //电池剩余电量
intent.getIntExtra("scale", 0);  //获取电池满电量数值
intent.getStringExtra("technology");  //获取电池技术支持
intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN); //获取电池状态
intent.getIntExtra("plugged", 0);  //获取充电方式
intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN);  //获取电池健康度
intent.getIntExtra("voltage", 0);  //获取电池电压,单位为mV
intent.getIntExtra("temperature", 0);  //获取电池温度,获取到的值除以10以后得到℃
  1. level和scale获取的不是电量的绝对值,只能使用levle/scale获取剩余电量的百分比
  2. 获取电池健康状态
 val health =
                intent.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN)  ///获取电池健康度
            when (health) {
                BatteryManager.BATTERY_HEALTH_GOOD -> {
                    tv_battery_health.text = "良好"
                }
                BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE -> {
                    tv_battery_health.text = "电压过高"
                }
                BatteryManager.BATTERY_HEALTH_COLD -> {
                    tv_battery_health.text = "过冷"
                }
                BatteryManager.BATTERY_HEALTH_DEAD -> {
                    tv_battery_health.text = "损坏"
                }
                BatteryManager.BATTERY_HEALTH_OVERHEAT -> {
                    tv_battery_health.text = "过热"
                }
                else -> {
                    tv_battery_health.text = "未知"
                }
            }

3.获取电池充电状态

intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN); //获取电池状态

   获取到的值有以下情况

    public static final int BATTERY_STATUS_UNKNOWN 
    public static final int BATTERY_STATUS_CHARGING  //充电中
    public static final int BATTERY_STATUS_DISCHARGING  //放电中
    public static final int BATTERY_STATUS_NOT_CHARGING //未充电
    public static final int BATTERY_STATUS_FULL  //已充满
  1. 获取充电方式

intent.getIntExtra("plugged", 0); //获取充电方式

int BATTERY_PLUGGED_AC  使用充电器充电
int BATTERY_PLUGGED_USB     使用USB充电
int BATTERY_PLUGGED_WIRELESS    使用无线方式充电

二.通过dumpsys battery获取到的信息

adb shell dumpsys battery

  AC powered: false ///有线充电器状态
  USB powered: true ///USB连接状态
  Wireless powered: false ///无线充电状态
  Max charging current: 500000 ///最大充电电流,单位微安(uA)
  Max charging voltage: 5000000 ///最大充电电压,单位微伏(uV)
  Charge counter: 4149000 ///
  status: 2 ///充电状态,UNKNOWN=1,CHARGING=2,DISCHARGING=3,NOT_CHARGING=4,FULL=5
  health: 2 ///电池健康状态
  present: true ///
  level: 95 ///当前95%
  scale: 100 ///满电100%
  voltage: 4244 ///电压
  temperature: 250 ///温度
  technology: Li-ion

三.BatteryManager获取到的信息

经测试: BATTERY_PROPERTY_CURRENT_NOW和BATTERY_PROPERTY_CURRENT_AVERAGE获取到的数据并不准确
测量设备电耗

API >= 21 (5.0,L)
BatteryManager manager = (BatteryManager) getSystemService(BATTERY_SERVICE);
manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);//剩余电量,单位 (mAH)微安小时
manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE);//当前电流,单位mA
manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW);//当前电流,单位mA
manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);///当前电量百分比
API >= 26 (8.0,O)
manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS);///充电状态

获取电池的总容量

  public static double getBatteryCapacity(Context context) {
        Object mPowerProfile;
        double batteryCapacity = 0;
        final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";

        try {
            mPowerProfile = Class.forName(POWER_PROFILE_CLASS)
                    .getConstructor(Context.class)
                    .newInstance(context);

            batteryCapacity = (double) Class
                    .forName(POWER_PROFILE_CLASS)
                    .getMethod("getBatteryCapacity")
                    .invoke(mPowerProfile);

        } catch (Exception e) {
            e.printStackTrace();
        }

        String info = batteryCapacity + " mAh";
        Log.i(TAG,"电池容量是: "+batteryCapacity);
        return batteryCapacity;
    }

知道电池总容量后可以根据当前电量的百分比,计算出当前电量。

你可能感兴趣的:(android 电量相关APi)