
Использования 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 вешаем обработчик на нужное событие и получаем уведомление в момент изменения. Это удобно, когда нужно мгновенно реагировать: например, переключить интерфейс в режим экономии при отключении от сети или показать предупреждение, когда заряд падает ниже критического. Логика прозрачная, код простой - в принципе, ничего сложного.
Code (JavaScript) : Убрать нумерацию
- if ('getBattery' in navigator && window.isSecureContext) {
- navigator.getBattery().then(battery => {
- // Статус подключения к сети
- function batteryCharging() {
- if (battery.charging) {
- console.log('Подключено к сети');
- }
- else {
- console.log('Работа от аккумулятора');
- }
- }
- // Уровень заряда
- function batteryLevel() {
- console.log('Заряд: '+(battery.level*100).toFixed(0)+'%');
- }
- // Время до разрядки (в человекопонятном формате)
- function batteryDischargingtimechange() {
- const seconds=battery.dischargingTime;
- if (!isFinite(seconds)) {
- console.log('Время до разрядки: не рассчитано');
- return;
- }
- const h=Math.floor(seconds/3600);
- const m=Math.floor((seconds%3600)/60);
- console.log('До разрядки: '+(h>0?h+' ч ':'')+m+' мин');
- }
- // Время до полной зарядки
- function batteryChargingtimechange() {
- const seconds=battery.chargingTime;
- if (!isFinite(seconds)) {
- console.log('Время до зарядки: не рассчитано');
- return;
- }
- const h=Math.floor(seconds/3600);
- const m=Math.floor((seconds%3600)/60);
- console.log('До зарядки: '+(h>0?h+' ч ':'')+m+' мин');
- }
- // Начальные значения
- batteryCharging();
- batteryLevel();
- batteryDischargingtimechange();
- batteryChargingtimechange();
- // Подписка на события
- battery.addEventListener('levelchange',
- batteryLevel);
- battery.addEventListener('chargingchange',
- batteryCharging);
- battery.addEventListener('dischargingtimechange',
- batteryDischargingtimechange);
- battery.addEventListener('chargingtimechange',
- batteryChargingtimechange);
- }).catch(err => {
- console.log('Battery API недоступен:', err);
- });
- }
- else {
- console.log('Battery API в этом браузере не поддерживается');
- }
Просмотров: 169 | Комментариев: 0
Метки: JavaScript
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария

