Compatibilidad con dispositivos sin batería

En esta página, se describe cómo Android controla los productos que tienen baterías extraíbles o no tienen baterías internas. En cambio, estos últimos dispositivos se conectan a una fuente de alimentación externa, como un tomacorriente de CA o un puerto USB en otro dispositivo.

¿Hay una batería presente?

Las aplicaciones pueden usar el siguiente código para detectar si el dispositivo tiene una batería presente:

```
final Intent batteryInfo = registerReceiver(null, new
IntentFilter(Intent.ACTION_BATTERY_CHANGED));

return batteryInfo.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
```

Comportamiento de dispositivos sin batería

Si Android no detecta un dispositivo de batería para tu producto, se usarán los siguientes valores predeterminados relacionados con la batería. Ten en cuenta que los valores predeterminados cambiaron en la versión de Android 9. En esta tabla, se muestran las diferencias.

Estado de la batería Android 9 y versiones posteriores Android 8.1 y versiones anteriores
Presente falso verdadero
Estado desconocido cargando
Capacidad restante 0 100%
Salud desconocido good
Estado en línea del cargador de CA sin modificar tenía que ser verdadero

Los fabricantes pueden modificar la configuración predeterminada con un controlador power_supply del kernel o Health HAL.

Android 9 y versiones posteriores

Android 9 quita de los dispositivos sin batería el código anterior que, de forma predeterminada, simulaba que había una batería cargada al 100% y en buen estado con una lectura de temperatura normal en su termistor.

La mayoría de las APIs de framework que se ocupan de esta información siguen controlando las situaciones comunes de la misma manera que antes: se considera que el sistema se está cargando (es decir, no funciona con la batería) y no se considerará que tiene batería baja. Si la interfaz de usuario dibuja el ícono de batería, aparecerá con un signo de exclamación y el porcentaje de batería se mostrará como 0%. Sin embargo, el dispositivo no se apagará debido a la batería baja, y se programarán los trabajos que requieran carga o batería en buen estado.

Android 8.1 y versiones anteriores

Debido a que se desconoce el estado de la batería, las APIs de framework de Android considerarán que el sistema se está cargando (o no funciona con la batería) y no se considerará que tiene batería baja. Si la interfaz de usuario renderiza el ícono de batería, aparecerá con un signo de exclamación y el porcentaje de batería se mostrará como 0%. Sin embargo, el dispositivo no se apagará debido a la batería baja, y se programarán los trabajos que requieran carga o batería en buen estado.

Implementación

Es posible que el código predeterminado de Android 9 funcione correctamente para tu dispositivo, pero se recomienda realizar un cambio en el kernel o en HAL para reflejar con precisión el estado de la alimentación y la batería de tu producto, como se describió anteriormente. Si Android 9 y versiones posteriores no detectan un dispositivo cargador de clase de fuente de alimentación de Linux, de forma predeterminada, todos los tipos de cargadores (CA, USB, inalámbrico) tendrán el estado sin conexión. Si todos los cargadores están sin conexión, pero no se detecta ningún dispositivo de batería, el sistema se seguirá considerando como cargando en el sentido de que se ejecuta con alimentación externa, no con batería, como se describió anteriormente.

Si tu producto no tiene batería y siempre está conectado a una fuente de alimentación, es mejor implementar un controlador charger de clase power_supply del kernel de Linux para la fuente de alimentación de CA o USB que establezca su atributo online sysfs en true. O bien, puedes configurar la propiedad en línea del cargador de CA en un HAL de Health para tu dispositivo. Para configurar la propiedad en línea del cargador de CA en un HAL de Health, consulta Health AIDL HAL.

Este HAL de Health personalizado implementa una versión personalizada de Health::getHealthInfo() que modifica el valor de BatteryProperties.chargerAcOnline = true.

Para comenzar, copia el archivo hardware/interfaces/health/aidl/default/Health.cpp en tu propia implementación de HAL de Health y modifícalo según el HAL de Health AIDL.