Compatibilité avec les appareils sans batterie

Cette page décrit comment Android gère les produits qui disposent de batteries amovibles ou qui n'en ont pas. Ces derniers sont connectés à une source d'alimentation externe, telle qu'une prise secteur ou un port USB sur un autre appareil.

Une batterie est-elle présente ?

Le code suivant peut être utilisé par les applications pour détecter si l'appareil dispose d'une batterie:

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

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

Comportement de l'appareil sans batterie

Si Android ne détecte pas de batterie pour votre produit, les valeurs par défaut suivantes sont utilisées. Notez que les valeurs par défaut ont changé dans la version Android 9. Le tableau suivant présente les différences.

État de la batterie Android 9 ou version ultérieure Android 8.1 ou version antérieure
Présent false true
État inconnu en charge
Capacité restante 0 100 %
Santé inconnu bien
État de connexion du chargeur secteur non modifiées forcée sur "true"

Les fabricants peuvent modifier les paramètres par défaut à l'aide d'un pilote power_supply du noyau ou d'un HAL de santé.

Android 9 ou version ultérieure

Android 9 supprime du code précédent pour les appareils sans batterie qui, par défaut, prétendaient qu'une batterie était présente, qu'elle était chargée à 100 % et qu'elle était en bon état, avec une température normale sur son thermistance.

La plupart des API de framework qui traitent de ces informations continuent de gérer les situations courantes de la même manière que précédemment: le système est considéré comme en charge (c'est-à-dire qu'il ne fonctionne pas sur batterie) et n'est pas considéré comme ayant une batterie faible. Si l'interface utilisateur dessine l'icône de la batterie, elle s'affiche avec un point d'exclamation, et le pourcentage de batterie est affiché à 0%. Toutefois, l'appareil ne s'arrête pas en raison d'une batterie faible, et les tâches nécessitant une recharge ou une batterie en bon état sont planifiées.

Android 8.1 ou version antérieure

Étant donné que l'état de la batterie est inconnu, les API du framework Android considéreront que le système est en charge (ou qu'il ne fonctionne pas sur batterie) et ne considéreront pas que la batterie est faible. Si l'interface utilisateur affiche l'icône de la batterie, elle s'affiche avec un point d'exclamation, et le pourcentage de batterie est affiché à 0%. Toutefois, l'appareil ne s'arrête pas en raison d'un faible niveau de batterie, et les tâches nécessitant une recharge ou une batterie en bon état sont planifiées.

Implémentation

Le code par défaut d'Android 9 peut fonctionner correctement pour votre appareil, mais il est recommandé d'apporter une modification du noyau ou du HAL pour refléter précisément l'état de l'alimentation et de la batterie de votre produit, comme décrit précédemment. Si Android 9 ou version ultérieure ne détecte pas de chargeur de la classe d'alimentation Linux, l'état de tous les types de chargeurs (CA, USB, sans fil) est hors connexion par défaut. Si tous les chargeurs sont hors connexion, mais qu'aucun appareil fonctionnant sur batterie n'est détecté, le système est toujours considéré comme en charge, car il fonctionne sur une alimentation externe, et non sur une batterie, comme décrit précédemment.

Si votre produit ne dispose pas de batterie et est toujours connecté à une source d'alimentation, il est préférable d'implémenter un pilote chargeur de la classe power_supply du kernel Linux pour la source d'alimentation CA ou USB qui définit son attribut sysfs en ligne sur true. Vous pouvez également configurer la propriété en ligne du chargeur secteur dans un HAL Santé pour votre appareil. Pour configurer la propriété en ligne du chargeur secteur dans un HAL de santé, consultez la section HAL de santé AIDL.

Ce HAL de santé personnalisé implémente une version personnalisée de Health::getHealthInfo() qui modifie la valeur de BatteryProperties.chargerAcOnline = true.

Pour commencer, copiez le fichier hardware/interfaces/health/aidl/default/Health.cpp dans votre propre implémentation du HAL Health et modifiez-le en fonction du HAL Health AIDL.