2014-04-10 4 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 % 17m에서 흘렀다. 따라서 배터리가 시간당 155 %로 방전되지 않습니다. 그래서, 나의 의심은 왜 그렇게 변동된 숫자를 얻는가입니다. –

답변

0

는 안드로이드의 배터리 상태 다이어그램에서보세요 고르다 이온. 더 큰 시간대에서 일정하게 보일지라도, 휴대 전화의 에너지 사용량은 때로는 작은 시간대에서 매우 크게 바뀝니다. 나는 틀릴 수도 있지만 어쩌면 1 % 배터리 수준 차이보다는 몇 분 시간 차이를 더 잘 찾아야합니다.