8

我已经尝试过Android的powerprofile ....我已经尝试过这段代码...但是它每次在所有设备中都给我1000个答案...在android中有没有其他方法可以获取电池容量...例如,如果移动设备容量是 2000mAh 它应该返回我 2000

public Double getBatteryCapacity() {

        Object mPowerProfile_ = null;
        double batteryCapacity = 0;
        final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";
        try {
            mPowerProfile_ = Class.forName(POWER_PROFILE_CLASS)
                    .getConstructor(Context.class).newInstance(this);

        } catch (Exception e) {

            // Class not found?
            e.printStackTrace();
        }

        try {

            // Invoke PowerProfile method "getAveragePower" with param
            // "battery.capacity"
            batteryCapacity = (Double) Class.forName(POWER_PROFILE_CLASS)
                    .getMethod("getAveragePower", java.lang.String.class)
                    .invoke(mPowerProfile_, "battery.capacity");

        } catch (Exception e) {

            // Something went wrong
            e.printStackTrace();
        }

        return batteryCapacity;
    }
4

2 回答 2

14

对于那些对@Yehan 建议的实施感兴趣的用户,这里有一个返回总电池容量的方法:(仅适用于 API Level >= 21)

public long getBatteryCapacity(Context context) {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        BatteryManager mBatteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
        Integer chargeCounter = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);
        Integer capacity = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

        if(chargeCounter == Integer.MIN_VALUE || capacity == Integer.MIN_VALUE)
            return 0;

        return (chargeCounter/capacity) *100;
    }
    return 0;
}

不幸的是,由于某种原因,这种方法并不总是有效。在这些情况下,您可以使用 Java 的反射 API 来检索 com.android.internal.os.PowerProfile 的 getBatteryCapacity 方法返回的值:

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

    return batteryCapacity;

}

来源: https ://android.googlesource.com/platform/frameworks/base/+/a029ea1/core/java/com/android/internal/os/PowerProfile.java

于 2017-10-13T19:14:39.743 回答
1

您可以使用 android.os.BatteryManager 的以下属性。BATTERY_PROPERTY_CHARGE_COUNTER 以微安时为单位提供剩余电池容量。BATTERY_PROPERTY_CAPACITY 以整数百分比为您提供剩余电池容量。

所以,

BATTERY_PROPERTY_CHARGE_COUNTER / BATTERY_PROPERTY_CAPACITY * 100

会给你总电池容量。这不是精确的计算,但您将能够关闭实际容量。

参考资料: https ://source.android.com/devices/tech/power/index.html#device-power http://developer.android.com/reference/android/os/BatteryManager.html

于 2015-05-04T09:06:33.110 回答