Итак, в настоящее время у меня есть следующий часто используемый метод получения текущего уровня заряда батареи, реализованный в моем приложении для 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. Чтобы обеспечить точность одного из моих алгоритмов, мне нужно получить более точное измерение уровня заряда батареи. Я видел, как некоторые приложения для управления батареями показывают милливольтовое напряжение, которое отлично работает. Если кто-то знает, как получить это значение, любая помощь будет принята с благодарностью.
Чтобы уточнить: мне нужен ТЕКУЩИЙ уровень заряда батареи, а не общая емкость батареи.
Спасибо!
------------------------ОБНОВИТЬ------------------------- -
Сейчас я использую следующий код:
// 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 Ultra работает на Android 4.4.4, и этот код не работает, он возвращает 0.0, однако при запуске на эмуляторе с несколькими версиями Android он действительно работает. Мне любопытно узнать, есть ли у других пользователей, тестирующих Droid Ultra, такую же проблему. Приведенный выше код должен работать на большинстве устройств.
На самом деле это НЕ точный уровень заряда батареи. Используя этот алгоритм, если процент заряда батареи был 97%, а общая емкость была 1000, точный уровень заряда батареи был бы 970. Теперь, если ФАКТИЧЕСКИЙ процент заряда батареи составляет 96,7%, мой getBatteryPercent вернет 97. Это приведет к ТАКОМУ ТОЧНОМУ ОТВЕТУ . Итак, этот алгоритм НЕ является ответом на этот вопрос. Я все еще ищу ответ на этот вопрос !!! Мне нужно измерить уровень заряда батареи, который будет более точным, чем + -1% ...
------------------------ОБНОВИТЬ------------------------- -
Я обнаружил, что если вы используете getIntExtra ("Voltage", -1) в широковещательном приемнике, прослушивающем ACTION_BATTERY_CHANGED. Это дает вам мВ. Интересно, достаточно ли это значение, чтобы использовать его для прогнозов времени автономной работы. Кто-нибудь знает, как я могу получить напряжение в любой момент времени, не полагаясь на самое последнее обновление с моего широковещательного приемника?
РЕДАКТИРОВАТЬ: Оказывается, это нежизнеспособно. этот график показывает, что напряжение аккумулятора является очень плохим индикатором емкости аккумулятора.