배터리 충전 또는 방전 속도를 계산하려고합니다. ACTION_BATTERY_CHANGED를 사용하여 이벤트를 수신하고 최소 1 %의 변경을 기다립니다. 그런 다음 시간 차이 (밀리 초)로 배터리 잔량을 나눕니다. 결과를 1000 * 60 * 60으로 곱하여 "시간당 %"단위로 비율을 표시합니다. 그러나 나는 그것이 올바르게하고 있는지 또는 어떤 실수가 있는지 확실하지 않습니다. 왜냐하면 때로는 약 6 % 또는 15 %의 충전 또는 방전을 나타내는 것으로 보입니다. 그러나 때로는 약 15000 %를 나타냅니다.Android - 배터리 충전 또는 방전 속도 계산
아무도이 코드의 문제점을 알려주십시오. 여기
내 코드입니다 :등록 :
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 분실에 걸린 시간을 계산하고 이전 요율에 따라 얼마만큼의 시간이 남았는지 추정하려고 시도합니다. 사실 정확한 것은 아닙니다. – shkschneider
https://www.dropbox.com/s/zss2dpns74irrq5/Screenshot_2014-04-10-06-58-26.png이 이미지를 보면 155 %가 표시되며 배터리 잔량이 44 % 17m에서 흘렀다. 따라서 배터리가 시간당 155 %로 방전되지 않습니다. 그래서, 나의 의심은 왜 그렇게 변동된 숫자를 얻는가입니다. –