2015-01-20 8 views
0

Итак, в настоящее время у меня есть следующий широко используемый метод получения текущего уровня заряда батареи, реализованного в приложении для Android.Получить точный уровень заряда батареи на андроиде

int getBatteryPercent(){ 
    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = this.registerReceiver(null, ifilter); 
    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    return level; 
} 

Проблема в том, что это возвращает целое число 0-100. Чтобы обеспечить точность одного из моих алгоритмов, мне нужно получить более точное измерение уровня заряда батареи. Я видел, что некоторые приложения для управления батареями показывают mV, которые будут работать отлично. Если кто-то знает, как получить эту ценность, любая помощь будет очень оценена.

Чтобы уточнить: мне нужен уровень заряда аккумулятора, а не общая емкость аккумулятора.

Спасибо!

------------------------ ОБНОВЛЕНИЕ ---------------------- ------

Я сейчас, используя следующий код:

// Method for getting the current battery percentage 
int getBatteryPercent(){ 
    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = this.registerReceiver(null, ifilter); 
    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    return level; 
} 

// Method for getting the total battery capacity 
double getBatteryCapacity() { 
    double battCapacity = 0.0d; 
    Object mPowerProfile_ = null; 

    Log.d("Debug", "in getBatteryCapacity()"); 

    final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile"; 

    try { 
     mPowerProfile_ = Class.forName(POWER_PROFILE_CLASS) 
       .getConstructor(Context.class).newInstance(this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.d("Debug", "Try 1 - Exception e: " + e.toString()); 
    } 

    try { 
     battCapacity = (Double) Class 
       .forName(POWER_PROFILE_CLASS) 
       .getMethod("getAveragePower", java.lang.String.class) 
       .invoke(mPowerProfile_, "battery.capacity"); 
     Log.d("Debug", "battCapacity is now: " + battCapacity); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.d("Debug", "Try 2 - Exception e: " + e.toString()); 
    } 

    Log.d("Debug", "Leaving getBatteryCapacity()"); 
    return battCapacity; 
} 

// Method for getting the exact current battery level 
double getExactBattery(){ 
    Log.d("Debug", "In getExactBattery()"); 
    float batteryPercentage = getBatteryPercent(); 
    Log.d("Debug", "batteryPercentage = " + batteryPercentage); 
    double totalCapacity = getBatteryCapacity(); 
    Log.d("Debug", "totalCapacity = " + totalCapacity); 
    double currLevel = (totalCapacity * (double)batteryPercentage)/100.0d; 
    Log.d("Debug", "currLevel = " + currLevel); 
    return currLevel; 
} 

но метод getBatteryCapacity дает мне 0.0 возвращение:

01-20 06:37:27.314 7162-7162/com... D/Debug﹕ In getExactBattery() 
01-20 06:37:27.324 7162-7162/com... D/Debug﹕ batteryPercentage = 47.0 
01-20 06:37:27.329 7162-7162/com... D/Debug﹕ in getBatteryCapacity() 
01-20 06:46:00.644 9207-9207/com... D/Debug﹕ battCapacity is now: 0.0 
01-20 06:37:27.329 7162-7162/com... D/Debug﹕ Leaving getBatteryCapacity() 
01-20 06:37:27.329 7162-7162/com... D/Debug﹕ totalCapacity = 0.0 
01-20 06:37:27.329 7162-7162/com... D/Debug﹕ currLevel = 0.0 

У меня есть Droid Ультра работает на Android 4.4.4, и этот код не работает, он возвращается 0.0, однако при запуске на эмуляторе с несколькими версиями Android он действительно работает. Мне любопытно узнать, есть ли у других пользователей тестирование на Droid Ultra те же проблемы. Вышеприведенный код должен работать на большинстве устройств.

Это на самом деле НЕ точный уровень заряда батареи. Используя этот алгоритм, если процентная доля батареи составляла 97%, а общая емкость составляла 1000, то точный уровень заряда батареи читался бы 970. Теперь, если процент батареи ACTUAL составляет 96,7%, мой getBatteryPercent вернет 97. Это приведет к ТОЧНОМУ ТОЧНОМУ ОТВЕТУ , Таким образом, этот алгоритм НЕ является ответом на этот вопрос. Я все еще ищу ответ на этот вопрос !!! Мне нужна мера уровня заряда, которая более точная, чем + -1% ...

------------------------ UPDATE ---------------------------

Я узнал, что если вы используете getIntExtra («напряжение», -1) в прослушивающий ACTION_BATTERY_CHANGED. Это дает вам мВ. Интересно, действительно ли это значение достаточно надежное для использования в прогнозировании срока службы батареи. Кто-нибудь знает, как я могу захватить напряжение в любой момент времени, не полагаясь на последнее обновление от моего вещательного приемника?

EDIT: Оказывается, это нежизнеспособно. this graph показывает, что напряжение батареи является очень слабым индикатором емкости аккумулятора.

+0

Возможно дубликата http://stackoverflow.com/questions/23193388/android-get-battery-current-capacity-in-ma-and-total-capacity-of-battery-in-mah – Price

+0

@ user87049 Я уже прочитал этот вопрос/ответ. В любом случае, если код в ответе заключается в том, чтобы получить общую емкость аккумулятора или текущий уровень заряда аккумулятора, это четко не указано. Мне нужен текущий уровень – JayB

+0

Какое приложение это делает? Вы можете использовать dex2jar и jd-gui и выполнить поиск по ключевым словам, чтобы узнать, помогает ли это понять, как они получают значение. –

ответ

1

Получите аккумуляторную батарею в соответствии с ссылкой @ user87049 и используйте свою собственную функцию, чтобы получить текущий процент от батареи, и объедините эти два, чтобы получить текущую емкость.

int batteryPercentage = getBatteryPercentage() //Your function 
double batteryCapacity = getBatteryCapacity() //code from link from user87049. Change it to return value 
double currentCapacity = (batteryPercentage * batteryCapacity)/100 
+0

умный (upvoted)! Должен быть более простой способ, хотя .. – JayB

+0

Я не уверен. Если вы объедините это в одну функцию, почему вы хотите более простой способ? – 0xDEADC0DE

+0

Кажется, что не работает. Код из ссылки дает мне 0.0 возврата. Я отправил обновление моего вопроса с моим кодом – JayB

-1

Согласно this answer, вы можете получить значение Тесто мАч следующим:

public double getBatteryCapacity() { 
    Object mPowerProfile_ = null; 

    final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile"; 

    try { 
     mPowerProfile_ = Class.forName(POWER_PROFILE_CLASS) 
       .getConstructor(Context.class).newInstance(this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     double batteryCapacity = (Double) Class 
       .forName(POWER_PROFILE_CLASS) 
       .getMethod("getAveragePower", java.lang.String.class) 
       .invoke(mPowerProfile_, "battery.capacity"); 
     return batteryCapacity; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return 0; 
} 
+0

Проверьте, обновлен ли мой вопрос. 0 – JayB

+0

проверить, не попадает ли он на какие-либо исключения, см. Журнал, чтобы узнать, если что-то пошло не так. –

1

Эта функция поможет вам.

public float getBatteryPCT() 
{ 
     IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     Intent batteryStatus = this.registerReceiver(null, ifilter); 
     int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     //Check if charging. 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; 
     //Check if charger plugged in. 
     int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     //check if charging via USB. 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     //check if charging via AC. 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
     int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
     int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
     float batteryPct = level/(float)scale; 
     //Get the current battery percentage. 
     return batteryPct*100; 
} 
+0

Не помогает вообще, что возвращает значение от 0 до 100, ему нужно более гранулированный. – SMKS

 Смежные вопросы

  • Нет связанных вопросов^_^