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 se conectan a una fuente de alimentación externa, como un tomacorriente de CA o un puerto USB de otro dispositivo.
¿Hay una batería?
Las aplicaciones pueden usar el siguiente código para detectar si el dispositivo tiene una batería:
```
final Intent batteryInfo = registerReceiver(null, new
IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryInfo.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
```
Comportamiento de los 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 |
---|---|---|
Presentar | falso | verdadero |
Estado | desconocido | cargando |
Capacidad restante | 0 | 100% |
Salud | desconocido | bueno |
Estado en línea del cargador de CA | Sin modificaciones | Se fuerza a verdadero. |
Los fabricantes pueden alterar la configuración predeterminada con un controlador power_supply del kernel o un HAL de Health.
Android 9 y versiones posteriores
Android 9 quita parte del código anterior para dispositivos sin batería que, de forma predeterminada, simulaba que había una batería, que se estaba cargando al 100% y que estaba en buen estado con una lectura de temperatura normal en su termistor.
La mayoría de las APIs del framework que se encargan 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, que no se está ejecutando con la batería) y no se considera que tiene poca batería. 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á por batería baja y se programarán los trabajos que requieran carga o buena batería.
Android 8.1 y versiones anteriores
Dado que se desconoce el estado de la batería, las APIs del framework de Android considerarán que el sistema se está cargando (o que no se está ejecutando con la energía de la batería) y no se considerará que tiene poca batería. 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á por batería baja y se programarán los trabajos que requieran carga o buena batería.
Implementación
Es posible que el código predeterminado de Android 9 funcione correctamente en tu dispositivo, pero se recomienda que realices un cambio en el kernel o en la HAL para reflejar con precisión el estado de la batería y la energía de tu producto, como se describió anteriormente. Si Android 9 y versiones posteriores no detectan un dispositivo de carga 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 con batería, se seguirá considerando que el sistema se está cargando, ya que funciona con energía externa y 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, lo mejor es implementar un controlador cargador de la clase power_supply del kernel de Linux para la fuente de alimentación de CA o USB que establezca su atributo en línea sysfs
en true
. También 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 una HAL de Health, consulta HAL de AIDL de Health.
Esta HAL de Health personalizada 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 la HAL de AIDL de Health.