Compatibilité avec les appareils sans batterie

Cette page décrit comment Android gère les produits qui ont des batteries amovibles ou pas de batterie interne. Ces derniers sont plutôt connectés à une source d'alimentation externe, comme une prise secteur ou un port USB d'un autre appareil.

Une batterie est-elle présente ?

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

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

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

Comportement des appareils sans batterie

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

État de la batterie Android 9 ou version ultérieure Android 8.1 et versions antérieures
Présenter false true
État inconnu en charge
Capacité restante 0 100 %
Santé inconnu bien
État en ligne du chargeur secteur non modifiée forced sur "true"

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

Android 9 ou version ultérieure

Android 9 supprime une partie du code précédent pour les appareils sans batterie qui, par défaut, simulaient la présence d'une batterie, en charge à 100 %, en bon état et avec une température normale sur sa thermistance.

La plupart des API de framework qui traitent ces informations continuent de gérer les situations courantes de la même manière qu'auparavant : 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 affiche l'icône de la batterie, elle sera accompagnée d'un point d'exclamation et le pourcentage de la batterie sera indiqué comme étant de 0 %. Toutefois, l'appareil ne s'éteint pas en raison du faible niveau de batterie, et les tâches qui nécessitent une recharge ou une batterie en bon état sont planifiées.

Android 8.1 et versions antérieures

É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 n'est pas alimenté par la batterie) et ne sera pas considéré comme ayant une batterie faible. Si l'interface utilisateur affiche l'icône de batterie, elle sera accompagnée d'un point d'exclamation et le pourcentage de batterie sera indiqué comme étant de 0 %. Toutefois, l'appareil ne s'éteint pas en raison du faible niveau de batterie, et les tâches qui nécessitent une recharge ou une bonne batterie sont planifiées.

Implémentation

Le code par défaut d'Android 9 peut fonctionner correctement pour votre appareil, mais il est recommandé de modifier le noyau ou la 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 classe d'alimentation Linux, tous les types de chargeurs (secteur, USB, sans fil) auront par défaut l'état hors connexion. Si tous les chargeurs sont hors connexion, mais qu'aucun appareil à batterie n'est détecté, le système sera toujours considéré comme en charge, car il fonctionne sur une source d'alimentation externe et non sur 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 charger de la classe power_supply du noyau Linux pour la source d'alimentation CA ou USB qui définit son attribut online sysfs sur true. Vous pouvez également configurer la propriété en ligne du chargeur CA dans une interface HAL Health pour votre appareil. Pour configurer la propriété en ligne du chargeur CA dans une interface HAL Health, consultez Health AIDL HAL.

Cette HAL Health personnalisée 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 Health HAL et modifiez-le en fonction de Health AIDL HAL.