Blog. Just Blog

Использования Battery API на JavaScript

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Использования Battery API на JavaScript
Использования Battery API на JavaScript

Battery Status API - это веб-интерфейс, позволяющий JavaScript-коду получать информацию о состоянии аккумуляторной батареи устройства, на котором открыта веб-страница. Изначально он создавался для оптимизации работы веб-приложений: например, для снижения частоты обновлений или отключения тяжелых задач при низком заряде. Или - для своевременного сохранения данных при угрозе отключения питания. Я уже делал нечто подобное на WinAPI, теперь расскажу, как это работает в JavaScript.

Вообще ситуация с Battery Status API неоднозначная. Этот интерфейс работает только в безопасном контексте (Secure Context) - то есть через HTTPS или на localhost. Более того, API удален из большинства современных браузеров. Причина в том, что существует риск идентификации пользователей: веб-страница получает параметры - например, точный уровень заряда и время до полной зарядки. Поскольку эти данные уникальны для каждого устройства и сессии, они позволяли отслеживать пользователей без использования cookie. В самом свежем Chrome все прекрасно работает, но никто не гарантирует, что этот функционал не отключат без предупреждения. Так что если планируете использовать Battery API, все надо тщательно проверять.

Для работы с API интерфейс BatteryManager предоставляет набор свойств, и все они доступны только для чтения. Вот главные из них. charging - логический флаг, который показывает, подключено ли устройство к зарядке прямо сейчас. level - текущий уровень заряда в диапазоне от 0.0 до 1.0. Удобно сразу привязывать к прогресс-барам или визуальному индикатору. chargingTime - оставшееся время в секундах до полного заряда. Если батарея уже полная, вернет 0. dischargingTime - прогнозируемое время до полного разряда и перехода системы в спящий режим. Как с этим работать на практике? Логика простая: пока флаг charging == true, смотрим только на chargingTime. Как только устройство отключили от сети (флаг charging == false), переключаем внимание на dischargingTime. Остальные параметры держим в фоне, но именно эта связка помогает приложению адекватно реагировать на изменения питания.

Для взаимодействия используются события, на которые можно подписаться. chargingchange - срабатывает при изменении состояния зарядки аккумулятора (свойство charging), levelchange - при изменении уровня заряда (свойство level). За временные параметры отвечают chargingtimechange - генерируется при обновлении времени до полного заряда (свойство chargingTime), и dischargingtimechange - при изменении времени до полного разряда (свойство dischargingTime). Подписка стандартная: через addEventListener вешаем обработчик на нужное событие и получаем уведомление в момент изменения. Это удобно, когда нужно мгновенно реагировать: например, переключить интерфейс в режим экономии при отключении от сети или показать предупреждение, когда заряд падает ниже критического. Логика прозрачная, код простой - в принципе, ничего сложного.
  1. if ('getBattery' in navigator && window.isSecureContext) {
  2.   navigator.getBattery().then(battery => {
  3.     // Статус подключения к сети
  4.     function batteryCharging() {
  5.         if (battery.charging) {
  6.             console.log('Подключено к сети');
  7.         }
  8.         else {
  9.             console.log('Работа от аккумулятора');
  10.         }
  11.     }
  12.  
  13.     // Уровень заряда
  14.     function batteryLevel() {
  15.         console.log('Заряд: '+(battery.level*100).toFixed(0)+'%');
  16.     }
  17.  
  18.     // Время до разрядки (в человекопонятном формате)
  19.     function batteryDischargingtimechange() {
  20.         const seconds=battery.dischargingTime;
  21.         if (!isFinite(seconds)) {
  22.             console.log('Время до разрядки: не рассчитано');
  23.             return;
  24.         }
  25.         const h=Math.floor(seconds/3600);
  26.         const m=Math.floor((seconds%3600)/60);
  27.         console.log('До разрядки: '+(h>0?h+' ч ':'')+m+' мин');
  28.     }
  29.  
  30.     // Время до полной зарядки
  31.     function batteryChargingtimechange() {
  32.         const seconds=battery.chargingTime;
  33.         if (!isFinite(seconds)) {
  34.             console.log('Время до зарядки: не рассчитано');
  35.             return;
  36.         }
  37.         const h=Math.floor(seconds/3600);
  38.         const m=Math.floor((seconds%3600)/60);
  39.         console.log('До зарядки: '+(h>0?h+' ч ':'')+m+' мин');
  40.     }
  41.  
  42.     // Начальные значения
  43.     batteryCharging();
  44.     batteryLevel();
  45.     batteryDischargingtimechange();
  46.     batteryChargingtimechange();
  47.  
  48.     // Подписка на события
  49.     battery.addEventListener('levelchange',
  50.         batteryLevel);
  51.     battery.addEventListener('chargingchange',
  52.         batteryCharging);
  53.     battery.addEventListener('dischargingtimechange',
  54.         batteryDischargingtimechange);
  55.     battery.addEventListener('chargingtimechange',
  56.         batteryChargingtimechange);
  57.  
  58.   }).catch(err => {
  59.     console.log('Battery API недоступен:'err);
  60.   });
  61. }
  62. else {
  63.   console.log('Battery API в этом браузере не поддерживается');
  64. }
Готовый пример можно посмотреть на демонстрационной странице. Результаты показываются в консоли. Для удобства лучше использовать ноутбук - тут можно посмотреть, как работает Battery Status API с аккумулятором и при зарядке от сети.

Поделиться ссылкой ВКонтакте
Просмотров: 169 | Комментариев: 0

Метки: JavaScript

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0024 сек.) / Память: 4.5 Mb
Наверх