Compatibilidad con dispositivos sin batería

Esta página describe cómo Android maneja los productos que tienen baterías extraíbles o no tienen baterías internas. En cambio, estos últimos dispositivos están conectados 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 actualmente:

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

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

Comportamiento del dispositivo sin batería

Si Android no detecta un dispositivo con batería para su producto, se utilizan los siguientes valores predeterminados relacionados con la batería. Tenga en cuenta que los valores predeterminados han cambiado en la versión de Android 9. Esta tabla muestra las diferencias.

Estado de la batería Android 9 y superior Android 8.1 y versiones anteriores
Regalo falso cierto
Estado desconocido cargando
Capacidad restante 0 100%
Salud desconocido bien
Estado en línea del cargador de CA no modificado forzado a la verdad

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

Android 9 y superior

Android 9 elimina algunos códigos anteriores para dispositivos sin batería que, de forma predeterminada, simulaban que había una batería presente, se cargaban al 100 % y estaban en buen estado con una lectura de temperatura normal en su termistor.

La mayoría de las API de framework que manejan esta información continúan manejando situaciones comunes de la misma manera que antes: se considerará que el sistema se está cargando (es decir, no funciona con batería) y no se considerará que tiene poca batería. Si la interfaz de usuario dibuja el ícono de la batería, aparecerá con un signo de exclamación y el porcentaje de batería se mostrará como 0%. Pero el dispositivo no se apagará debido a la batería baja y se programarán 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 API del marco de trabajo de Android considerarán que el sistema se está cargando (o que no funciona con la energía de la batería) y no se considerará que tiene poca batería. Si la interfaz de usuario muestra el ícono de la batería, aparecerá con un signo de exclamación y el porcentaje de batería se mostrará como 0%. Pero el dispositivo no se apagará debido a la batería baja y se programarán trabajos que requieran carga o batería en buen estado.

Implementación

El código predeterminado de Android 9 puede funcionar correctamente para su dispositivo, pero se recomienda realizar un cambio de kernel o HAL para reflejar con precisión el estado de energía y batería de su producto, como se describe anteriormente. Si Android 9 y versiones posteriores no detectan un dispositivo cargador de clase de fuente de alimentación de Linux , todos los tipos de cargador (CA, USB, inalámbrico) tendrán el estado fuera de línea de forma predeterminada. Si todos los cargadores están fuera de línea pero no se detecta ningún dispositivo con batería, se considerará que el sistema se está cargando en el sentido de que está funcionando con energía externa, no con batería, como se describió anteriormente.

Si su producto no tiene batería y siempre está conectado a una fuente de alimentación, es mejor implementar un controlador de cargador de clase power_supply del kernel de Linux para la fuente de alimentación de CA o USB que establezca su atributo sysfs en línea en true . O puede configurar la propiedad en línea del cargador de CA en una HAL de salud para su dispositivo. Para hacer esto, implemente una HAL de Salud como se describe en Implementación de Salud 2.0 .

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

Para comenzar, copie el archivo hardware/interfaces/health/2.0/default/Health.cpp en su propia implementación de Health HAL y modifíquelo de acuerdo con Health 2.0 README .