【问题标题】:Android - Calculating Battery Charging or Discharging rateAndroid - 计算电池充电或放电率
【发布时间】:2014-04-10 10:11:04
【问题描述】:

我正在尝试计算电池充电或放电率。我使用 ACTION_BATTERY_CHANGED 来接收事件,并等待至少 1% 的变化。然后我将电池电量的差异除以时间(毫秒)的差异。我将结果乘以 1000 * 60 * 60 以显示“每小时单位百分比”的速率。但我不确定我做得对还是有一些错误。因为,有时它会显示大约 6% 或 15% 的充电或放电,这似乎是正确的。但有时它显示在 15000% 左右。

谁能告诉我这段代码有什么问题。

这是我的代码:

注册:

IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(new EnReceiverOnBatteryChange(), batteryLevelFilter)

接收者:

public class EnReceiverOnBatteryChange extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Utils.recordChargeOrDischargeRate(context);
        ActivityHome.updateBatteryInfo(context);
    }
}

计算:

public static void recordChargeOrDischargeRate(Context context)
{
    long lCurrentTime = System.currentTimeMillis();
    float fCurrentBatteryLevel = 0;

    float fRate = 0;
    if ((mfLastBatteryLevel != -1) && (mlLastTime != -1))
    {
        SharedPreferences preferences = context.getSharedPreferences(Konstant.PREFERENCES_FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor prefEditor = preferences.edit();

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

        if (level != -1 && scale != -1)
        {
            fCurrentBatteryLevel = 100 * level / (float) scale;
        }

        float fBatteryLevelDifference = Math.abs(fCurrentBatteryLevel - mfLastBatteryLevel);
        if (fBatteryLevelDifference > 0.99)
        {
            fRate = (fBatteryLevelDifference / (lCurrentTime - mlLastTime)) * 1000 * 60;

            prefEditor.putString(Konstant.KEY_PREF_CHARGING_START_RATE, String.format("%.2f", (fRate * 60)) + "%");
            prefEditor.commit();

            int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
            boolean isCharging = (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL);

            if (isCharging)
            {
                int nMinutes = Math.round((100 - fCurrentBatteryLevel) / fRate);
                int nHour = nMinutes / 60;
                nMinutes = nMinutes % 60;
                prefEditor.putString(Konstant.KEY_PREF_FULL_CHARGE_IN, nHour + "h " + nMinutes + "m");
                prefEditor.commit();
            }
            else
            {
                int nMinutes = Math.round(fCurrentBatteryLevel / fRate);
                int nHour = nMinutes / 60;
                nMinutes = nMinutes % 60;
                prefEditor.putString(Konstant.KEY_PREF_FULL_CHARGE_IN, nHour + "h " + nMinutes + "m");
                prefEditor.commit();
            }

            mlLastTime = lCurrentTime;
            mfLastBatteryLevel = fCurrentBatteryLevel;
        }
    }
    else
    {
        mlLastTime = lCurrentTime;
        mfLastBatteryLevel = fCurrentBatteryLevel;
    }
}

【问题讨论】:

  • “有时会显示充电或放电 15000%”是什么意思?否则,您的方法有点正确:您计算损失 X 电荷所需的时间,并尝试根据以前的费率估计还剩多少时间。事实上,它从来都不准确。
  • dropbox.com/s/zss2dpns74irrq5/… 如果你看这张图片,它显示155%,很明显44%的电池电量在17m内不会耗尽。因此,电池不会以每小时 155% 的速度放电。所以,我怀疑为什么我会得到如此波动的数字。

标签: android android-intent batterylevel


【解决方案1】:

看一下android选项中的电池状态图。您的手机的能源使用率有时会在较小的时间尺度上发生相当大的变化 - 尽管它在较大的时间尺度上看起来是恒定的。 我可能是错的,但也许你最好看看几分钟的时间差,而不是 1% 的电池电量差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2014-06-28
    • 1970-01-01
    • 2018-11-21
    • 2011-07-29
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多