анализ работы батареи android

111
17 апреля 2021, 13:40

Требуется анализировать работу батареи в реальном времени так, чтобы получить предположительные сведения о том, сколько осталось времени до того, как батарея сядет, а так же расход батареи в процентах в минуту. Подскажите, пожалуйста, инструменты, которые могут в этом помочь.

Answer 1

Для начала нужно узнать какое текущее состояние зарядки:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

дальше вы можете узнать текущий статус батареи:

// Зарядились/заряжаемся?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;
// Как именно мы заряжаемся?
int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

Следующий этап - отслеживание изменения состояния батареи. Для этого вам нужно в манифесте добавить ресивер для получения данных о батарее:

<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

и дальше сам ресивер:

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;
        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
    }
}

Текущий заряд ( в процентах) можно определить так:

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;

Дальше вы можете отследить существенные изменения (так написано в доках и мне кажется что это очень разряженное состояние у батареи):

<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  </intent-filter>
</receiver>

Вот есть либа для получения статистики о использовании батареи. Вот доки по теме батареи и получения статуса. Вот доки по вопросу оптимизации работы батареи. Вам для прогнозирования времени работы батареи нужно будет брать логи BatteryManager и дальше высчитывать скорость разряда исходя из полученных данных, и дальше из этой скорости калькулировать приблизительное (тут ключевое слово приблизительное) время работы устройства от батареи. Но это время может меняться в зависимости от того как интенсивно вы используете устройство так как на разряд влияет куча факторов, вот статья по этому вопросу. И мой вам совет - найдите какую-то более-менее адекватную программу для сравнения времени работы, чтобы у вас не получились какие-то магические числа исходя из которых у пользователя будет 100к мАч батарея на устройстве :)

READ ALSO
Почему Cursor возвращает null IntentService Android

Почему Cursor возвращает null IntentService Android

При создании уведомления я получаю значение Uri такого формата

88
Подскажите как с другого класса добавить текст в TextArea JavaFX чтобы оно отобразилось в приложении?

Подскажите как с другого класса добавить текст в TextArea JavaFX чтобы оно отобразилось в приложении?

Не могу понять как это сделать, уже все перепробовалTextArea находится в классе BotOverviewController, а передаю данный с класса MainApp

115
Массив чисел в одно число через Stream

Массив чисел в одно число через Stream

Дано - входящий массив; из которого нужно убрать все дубликаты и вернуть число, состоящее из оставшихся чисел массиваРеализовать нужно через...

137
Присвоение значения с TextField в String

Присвоение значения с TextField в String

Не понимаю, как присвоить значение String c TextField

103