【问题标题】:Getting the battery level获取电池电量
【发布时间】:2019-01-04 11:41:52
【问题描述】:

我知道有很多这样的问题,但无论是否可能,我都需要一个具体的答案。

我想获取任何 Android 手机的当前可用电池电量(以 mAh 为单位)。这对我的项目至关重要。我试过 BatteryManager。

batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);

它准确地提供了我需要的信息,但仅适用于某些设备。

我还尝试通过 Java 反射使用 PowerProfile。

public void getBatteryCapacity() {
    Object mPowerProfile_ = null;

    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) {
        e.printStackTrace();
    }

    try {
        double batteryCapacity = (Double) Class
                .forName(POWER_PROFILE_CLASS)
                .getMethod("getAveragePower", java.lang.String.class)
                .invoke(mPowerProfile_, "battery.capacity");
        Toast.makeText(OffloadeeActivity.this, batteryCapacity + " mAh",
                Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但它提供了总电池容量。我需要的是当前剩余的电池电量。 有什么通用的方法可以为每个设备获取它吗?任何图书馆也可以。

【问题讨论】:

标签: android battery


【解决方案1】:

这可以通过获取以毫安小时为单位的总电池容量,然后找到电池电量的百分比,最后将它们相乘以获得以毫安小时为单位的当前电池寿命。以下代码块是获取电池总容量(以毫安小时为单位)的函数:

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

现在您有了电池容量,您可以找到当前的电池寿命百分比,然后将其乘以总容量,得到以毫安小时为单位的电量

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

如果你想将电池百分比水平作为浮点数返回(例如89.92%),可以使用以下代码:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batLevel = (float) level / (float) scale;

现在,您可以执行以下操作来获得毫安小时电池寿命

int batteryInMilliamps = getBatteryCapacity(getApplicationContext()) * batLevel;

如果您收到任何问题或有任何疑问,请在下方发表评论。

【讨论】:

  • 你的方法是正确的。但我需要更精确的电池电量,因为我想在某些特定任务之前和之后计算电池电量。由于 BATTERY_PROPERTY_CAPACITY 将电池百分比返回为整数(没有小数部分),因此很难区分。有些任务只需要大约 20-50 mAh。
  • 那么你想要的是将电池百分比水平作为双倍返回?像 89.982%?以毫安小时为单位的电池容量已经翻倍返回。这也是你想要的双倍百分比水平吗?
  • @OwnageByte 我更新了我的答案以将电池百分比作为浮点数,这样当你将它乘以毫安小时时,它会给出更准确的结果。
  • 你在这里所做的是将这里的除法转换为浮点数。 level / (float) scale; 但是电池电量仍然是整数,来自android。 int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 假设我的电池电量百分比为 94%,根据您的计算,int batteryInMilliamps 将为 x。在我在设备上执行很少的任务后,电池百分比不会急剧下降。因此,当我在任务后再次获得电池百分比时,它仍然是 94。所以再次通过您的计算,电池电量将与 x 相同。所以 x-x=0。找我?
  • 是的,我明白了。这就是为什么我添加了第三个代码块,以将电池电量设为浮点数。没用吗?
【解决方案2】:

你试试这个对你有帮助

public static int getBatteryPercentage(Context context) {

    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;

    float batteryPct = level / (float) scale;

    return (int) (batteryPct * 100);
}

【讨论】:

  • 返回电池百分比。我想要的是剩余电池容量(mAh)。
  • @ZiedRebhi 返回完整的电池容量。我需要以 mAh 为单位的当前剩余电池电量。
  • @OwnageByte 我更新了我的答案以将电池百分比作为浮点数,这样当你将它乘以毫安小时时,它会给出更准确的结果。
猜你喜欢
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多