[Tips and Tricks] Windows 10: Gestión de la batería

Introducción

Entre la lista de factores importantes que marcan diferencia en practicamente cualquier dispositivo móvil encontramos la batería.
Hemos ido viendo una mejora paulatina pero gradual en la calidad y
duración de las mismas. Sin embargo, las exigencias requeridas también
han ido incrementando. Mayor cantidad de aplicaciones usadas por los
usuarios, más sensores, etc.

A pesar de las posibilidades ofrecidas por el sistema para poder
gestionar el uso de la batería, reducir opciones activas cuando empieza a
tener un nivel escaso, en nuestras propias aplicaciones y como
desarrolladores, contamos con APIs para poder trabajar con la batería;
detectar capacidad, porcentaje y otras opciones.

En este artículo, vamos a repasar todas las posibilidades
relacionadas con la batería disponibles en Windows 10 dentro del
namespace Windows.Devices.Power.

Trabajando con la batería

Crearemos un nuevo proyecto UAP:

Nueva App UAP

Nueva App UAP

Añadimos las carpetas Views, ViewModels y Services además de las clases base necesarias para implementar el patrón MVVM de la misma forma que vimos en este artículo.

Para acceder a información relacionada con la batería utilizaremos el
namespace Windows.Devices.Power donde tendremos acceso a la clase AggregateBattery.
Esta clase agrupa todas las baterías que pueda tener el dispositivo
(podrían ser más de una) otorgando acceso a información y reportes de
forma agrupada.

Utilizamos AggregateBattery para obtener información de la batería utilizando el método GetReport que nos devolverá una instancia de tipo BatteryReport.

var batteryReport = Windows.Devices.Power.Battery.AggregateBattery.GetReport();

Entre el conjunto de propiedades disponibles en el reporte, contamos con una propiedad llamada Status (enumeración BatteryStatus):

public string Status
{
     get { return _status; }
     set
     {
          _status = value;
          RaisePropertyChanged();
     }
}
 
Status = batteryReport.Status.ToString();

La enumeración de tipo BatteryStatus cuenta con las siguientes opciones:

  • NotPresent: No se encuentra batería.
  • Discharging: Batería descargándose.
  • Idle: Inactiva.
  • Charging: Batería cargándose.

Continuamos con otra propiedad, ChargeRateInMilliwatts:

public int ChargeRate
{
     get { return _chargeRate; }
     set
     {
          _chargeRate = value;
          RaisePropertyChanged();
     }
}
 
if (batteryReport.ChargeRateInMilliwatts != null)
     ChargeRate = batteryReport.ChargeRateInMilliwatts.Value;

Nos indica en mW el ritmo de carga o descarga en caso de valores negativos de la batería.

NOTA: El valor puede ser nulo en caso de no encontrar batería.

De igual forma que podemos saber el ritmo de carga, podemos conocer la capacidad de la batería con la propiedad FullChargeCapacityInMilliwattHours:

Y la capacidad disponible con RemainingCapacityInMilliwattHours:

public int RemainingCapacity
{
     get { return _remainingCapacity; }
     set
     {
           _remainingCapacity = value;
           RaisePropertyChanged();
     }
}
 
RemainingCapacity = batteryReport.RemainingCapacityInMilliwattHours.Value;

Ambos dados en mW-h. Con los valores anteriores, obtener el porcentaje actual de la batería es una operación sumamente simple:

public double Percentage
{
     get { return _percentage; }
     set
     {
           _percentage = value;
           RaisePropertyChanged();
     }
}
 
var percentage = (batteryReport.RemainingCapacityInMilliwattHours.Value /
                 (double)batteryReport.FullChargeCapacityInMilliwattHours.Value) * 100;
     
Percentage = percentage; 

Si ejecutamos la aplicación:

Información de la batería

Información de la batería

NOTA: Para obtener información válida en el
BatteryReport se debe ejecutar la App en un dispositivo físico. En caso
de ejecutar en emulador, se obtendrán nulos.

Podéis descargar el ejemplo completo realizado a continuación:

También tenéis el código fuente disponible e GitHub:

Ver GitHub

Recordar que podéis dejar en los comentarios cualquier tipo de sugerencia o pregunta.

Más información

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *