Итак, в настоящее время у меня есть следующий широко используемый метод получения текущего уровня заряда батареи, реализованного в приложении для 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 показывает, что напряжение батареи является очень слабым индикатором емкости аккумулятора.
Возможно дубликата http://stackoverflow.com/questions/23193388/android-get-battery-current-capacity-in-ma-and-total-capacity-of-battery-in-mah – Price
@ user87049 Я уже прочитал этот вопрос/ответ. В любом случае, если код в ответе заключается в том, чтобы получить общую емкость аккумулятора или текущий уровень заряда аккумулятора, это четко не указано. Мне нужен текущий уровень – JayB
Какое приложение это делает? Вы можете использовать dex2jar и jd-gui и выполнить поиск по ключевым словам, чтобы узнать, помогает ли это понять, как они получают значение. –