Обычная экономия заряда батареи

В Android 10 представлена ​​опция расписания экономии заряда батареи, которая называется «на основе рутины» . Эта опция позволяет приложению, выбранному OEM-производителем, подавать в систему сигналы для более интеллектуального планирования экономии заряда батареи. Этот параметр требует настройки и не является обязательным для реализации.

Конфигурация устройства

Спецификация поставщика

Чтобы уведомить пользовательский интерфейс настроек о том, что устройство настроено правильно, используйте наложение конфигурации, чтобы переопределить значение config_batterySaverScheduleProvider именем пакета вашего приложения.

Например, если вы хотите, чтобы пакет приложения com.google.android.apps.turbo управлял настройками на основе процедуры , вам следует установить следующее значение конфигурации:

<string name="config_batterySaverScheduleProvider" translatable="false">
com.google.android.apps.turbo</string>

Теперь телефон должен показать стандартный вариант. Чтобы проверить, создайте свой образ, загрузите его на телефон и выберите «Настройки» > «Аккумулятор» > «Экономия заряда» > «Расписание экономии заряда» . Должна появиться опция «На основе процедуры» .

Порог отключения по умолчанию

Новое поле config_dynamicPowerSavingsDefaultDisableThreshold указывает уровень заряда батареи, при котором система отключает режим экономии заряда, если он был включен планировщиком на основе подпрограмм . По умолчанию в системе установлено значение 80%, но вы можете его изменить.

Конфигурация приложения

Разрешения

API-интерфейсы, необходимые приложению для включения режима экономии заряда из приложения, защищены разрешением android.permission.POWER_SAVER . Это подпись/привилегированное разрешение, поэтому предоставьте приложению, которому вы хотите активировать режим экономии заряда, это разрешение в своем privapp-whitelist .

Пример предоставления разрешения privapp приложению:

<privapp-permissions package="com.google.android.apps.turbo">
   <permission name="android.permission.POWER_SAVER"/>
</privapp-permissions>

Если вы предварительно не предоставите это разрешение версии приложения в образе системы, приложение не сможет получить разрешение или правильно вызвать API. Система не предоставляет никакой обратной связи, кроме обычных ошибок разрешений, поэтому убедитесь, что вы можете вызывать API и наблюдать за их эффектами.

Установка

Для правильной работы программы необходимо предварительно установить приложение на образ системы с необходимым разрешением. Предоставьте только одному приложению разрешение POWER_SAVER и разрешите ему управлять стандартными API-интерфейсами. Поведение функции, когда несколько приложений пытаются использовать разрешение и API, не поддерживается и не указано.

Триггер экономии заряда батареи

API

Предполагая, что установка на данный момент прошла успешно, OEM-приложение, указанное в конфигурации, должно иметь возможность успешно вызывать связанный метод в PowerManager для запуска режима экономии заряда батареи:

public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold)

Если опция расписания экономии заряда батареи на основе обычного режима включена и приложение вызывает этот метод с true значением powerSaveHint , функция экономии заряда батареи включается. Укажите disableThreshold , чтобы, если приложение не может связаться с системой, система все равно знала, при каком проценте заряда батареи можно безопасно отключить режим экономии заряда.

Этот API может быть переопределен пользователем и отложен режимом экономии заряда так же, как и автоматический режим экономии заряда на основе процентов. Дополнительную информацию см. в документации API .

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

Например, если пользователь выбрал обычный режим экономии заряда батареи и приложение вызывает setDynamicPowerSaveHint(true, 10) , глобальные настройки должны иметь следующие значения:

automatic_power_save_mode: 1
dynamic_power_savings_disable_threshold: 10
dynamic_power_savings_enabled: 1

Если вы затем вызовете setDynamicPowerSaveHint(false, 25) , значения должны быть:

automatic_power_save_mode: 1
dynamic_power_savings_disable_threshold: 25
dynamic_power_savings_enabled: 0

Вы можете проверить эти значения с помощью этой команды adb :

adb shell settings get global <setting-name>

Проверка

Не существует автоматического способа проверки этой функции, поскольку невозможно узнать, какое поведение будет использовать OEM-производитель, чтобы решить, когда запускать обычный режим экономии заряда батареи. Таким образом, OEM-производители несут ответственность за тестирование своей интеграции, чтобы убедиться, что ее поведение соответствует ожиданиям. В частности, убедитесь, что устройство может выполнять следующие задачи:

  • Пользователь выбирает процент в пользовательском интерфейсе расписания экономии заряда батареи и выбирает 15%. Режим экономии заряда должен включаться автоматически ТОЛЬКО при достижении 15% заряда батареи.
  • Пользователь выбирает на основе процедуры в пользовательском интерфейсе расписания экономии заряда батареи. Когда приложение вызывает API с true , включается режим экономии заряда батареи. Кроме того, функция экономии заряда батареи автоматически отключается, если устройство заряжено до указанного порогового уровня и отключено от сети.
  • Пользователь не выбирает ничего в пользовательском интерфейсе расписания экономии заряда батареи. Режим экономии заряда батареи НИКОГДА не должен включаться автоматически.
  • Если приложение включает функцию экономии заряда батареи, а пользователь вручную отключает функцию экономии заряда батареи (с помощью быстрых настроек, настроек и т. д.), она должна ОСТАВАТЬСЯ ВЫКЛЮЧЕННОЙ до тех пор, пока пользователь не включит ее снова вручную или не подключит устройство к электросети.