Compatibilité avec les appareils sans batterie

Cette page explique comment Android gère les produits dotés de batteries amovibles ou sans batterie interne. Ces derniers sont plutôt connectés à une source d'alimentation externe, telle qu'une prise secteur ou un port USB d'un autre appareil.

Y a-t-il une batterie ?

Les applications peuvent utiliser le code suivant 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 dispositif de batterie pour votre produit, les valeurs par défaut suivantes concernant la batterie sont utilisées. Notez que les valeurs par défaut ont changé dans la version d'Android 9. Ce tableau présente les différences.

État de la batterie Android 9 ou version ultérieure Android 8.1 ou version antérieure
Présenter false true
État inconnu en charge
Capacité restante 0 100 %
Santé inconnu bien
État de connexion du chargeur CA non modifié forcé 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 certains codes précédents concernant les appareils sans batterie qui par défaut supposaient qu'une batterie était présente, étaient chargés à 100 % et étaient en bon état de santé avec une température normale sur sa thermistor.

La plupart des API de framework qui traitent ces informations continuent à gérer les situations courantes de la même manière qu'auparavant: le système est considéré comme en chargement (c'est-à-dire qu'il ne fonctionne pas sur batterie) et n'a pas de batterie faible. Si l'interface utilisateur affiche l'icône de batterie, elle apparaît avec un point d'exclamation et le pourcentage de batterie est indiqué à 0%. Toutefois, l'appareil ne s'éteint pas en raison d'une batterie faible, et les tâches qui nécessitent une charge ou une batterie de bonne qualité sont planifiées.

Android 8.1 ou version antérieure

Comme l'état de la batterie est inconnu, les API du framework Android considèrent que le système est en chargement (ou ne fonctionne pas sur batterie) et ne sont pas considérés comme ayant une batterie faible. Si l'interface utilisateur affiche l'icône de batterie, elle apparaît avec un point d'exclamation et le pourcentage de batterie est indiqué à 0%. Toutefois, l'appareil ne s'éteint pas en raison d'une batterie faible, et les tâches nécessitant une charge ou une batterie de bonne qualité sont planifiées.

Implémentation

Le code par défaut d'Android 9 peut fonctionner correctement pour votre appareil, mais nous vous recommandons d'effectuer un changement de noyau ou de HAL pour refléter avec précision l'état de la batterie et de l'alimentation 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) affichent 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 dans le sens où il fonctionne sur une source externe et non sur batterie, comme décrit précédemment.

Si votre produit ne possède pas de batterie et qu'il est toujours connecté à une source d'alimentation, il est préférable d'implémenter un pilote de chargeur de classe power_supply pour le noyau Linux pour la source d'alimentation secteur ou USB, qui définit son attribut sysfs en ligne sur true. Vous pouvez également configurer la propriété en ligne "Chargeur secteur" dans une HAL Health pour votre appareil. Pour configurer la propriété en ligne "Chargeur secteur" dans une instance HAL Health, consultez Health AIDL HAL.

Cette HAL d'état 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 d'HAL Health et modifiez-le en fonction de la HAL Health AIDL.