Android BatteryManager Альтернативы
Я пытаюсь получить статистику батареи в моем приложении для некоторого тестирования. Замечательный BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER позволяет мне запрашивать микро-усилители устройства, и это здорово. Тем не менее, это было введено только в API 21, поэтому количество устройств, к которым оно может быть подключено, весьма ограничено. Есть ли совместимый способ сделать что-то подобное в более низких версиях API (до 4.0)? Я знаю, что BatteryManager.EXTRA_LEVEL даст мне процент, но на самом деле это не совсем точно.
3 ответа
Насколько я знаю, вы не можете сделать это с более старыми публичными API. Я работал над приложением системного уровня, которое показывает статистику использования батареи пользователю. Я создал свой код в приложении "Настройки Android", и моим пользователям может потребоваться доступ с правами root или приложение должно быть подписано с помощью ключа платформы. Вы можете просмотреть классы PowerUsageDetail, BatteryInfo и PowerUsageSummary. Если вам повезет, вы можете получить доступ к скрытым API с помощью JAVA-отражения. В противном случае вам нужен ключ платформы или root. Внутренние API меняются очень часто, поэтому использовать их довольно сложно.
Есть также пара инструментов, которые вы можете проверить:
- adb shell dumpsys batterystats
- adb shell dumpsys batteryinfo
- историк батареи
- об ошибке в оболочке adb
Удачи!
Редактировать:
Ранее в этом году я натолкнулся на интересную статью о методе определения местоположения смартфонов, основанном только на энергопотреблении устройства, под названием PowerSpy.
Хотя я никогда не реализовывал / не тестировал метод сам, авторы утверждают, что:
На Android чтение совокупного измерителя мощности телефона выполняется путем многократного чтения следующих двух файлов:
/sys/class/power_supply/battery/voltage_now
/sys/class/power_supply/battery/current_now
,
Они также утверждают, что тестировали метод на Nexus 4, Nexus 5 и HTC. Хотя это не совсем то, в каких точных версиях Android были установлены устройства, предполагается, что Nexus 4 будет иметь уровень API 17 и Nexus 5 с уровнем API 19, но оба телефона, похоже, подлежат обновлению ОС.
Тем не менее, этот метод, по-видимому, радикально отличается от тех, что упоминались другими авторами, поэтому, вероятно, стоит упомянуть. К сожалению, это, кажется, низкоуровневый подход, поэтому может потребоваться много работы, чтобы получить то, что вам нужно, поскольку мощность, как в физике, на самом деле не означает расход заряда батареи. Но, может быть, вам нужно это так.
Наконец, в статье упоминалось, что доступ к этим двум файлам не требует специальных разрешений (что мотивировало исследование в первую очередь).
РЕДАКТИРОВАТЬ
Вторая мысль, если вы заговор P=U*I
(получая U и I, как упомянуто выше) и интегрируя по времени (это будет сумма в этом дискретном случае), вы можете просто получить очень хорошее приближение потребления батареи. Возможно, вы также включите фильтр Калмана (чтобы ослабить шум на U и I, имея в виду, что ваши алгоритмы не единственные потребители), и вы можете просто получить то, что вы хотите.
В соответствии с обучением по мониторингу батареи http://developer.android.com/training/monitoring-device-state/battery-monitoring.html, вы можете получить текущую информацию о батарее, используя:
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);
float batteryPct = level / (float)scale;
Обратите внимание, что вам нужно продолжать вызывать это несколько раз, чтобы получить обновленный уровень заряда батареи. Когда вы просыпаете свое приложение и проверяете, действительно ли он потребляет батарею, они предлагают: