0

バッテリーの充電率または放電率を計算しようとしています。ACTION_BATTERY_CHANGED を使用してイベントを受信し、最低 1% の変更を待ちます。次に、バッテリー レベルの差を時間差 (ミリ秒) で割ります。結果に 1000 * 60 * 60 を掛けて、「1 時間あたりの %」単位でレートを表示します。しかし、それが正しいのか、それとも間違いがあるのか​​ はわかりません。なぜなら、充電または放電が約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;
    }
}
4

1 に答える 1