2014-04-10 120 views
0

我正在计算电池充电或放电率。我使用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; 
    } 
} 
+0

你是什么意思“有时显示充电或放电15000%”?否则,你的方法是不正确的:你计算失去X电荷所用的时间量,并根据以前的速率来估计剩下多少时间。事实上这从来都不准确。 – shkschneider

+0

https://www.dropbox.com/s/zss2dpns74irrq5/Screenshot_2014-04-10-06-58-26.png如果你看这个图像,它显示155%,很明显,44%的电池电量不会是在17米沥干。所以,电池没有以每小时155%的速率放电。所以,我的疑问是为什么我得到如此波动的数字。 –

回答

0

看看在Android的电池状态图选择离子。您的手机的能源使用率有时会在较小的时间尺度上变化很大 - 尽管在较大的时间尺度上它看起来不变。 我可能是错的,但也许你应该更好地寻找几分钟的时间差异,而不是1%的电池电量差异。