Compatibilité avec les appareils sans batterie

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

Une batterie est-elle présente ?

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 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 suivant présente les différences.

État de la batterie Android 9 et versions ultérieures Android 8.1 et versions antérieures
Présent faux vrai
État inconnu en charge
Capacité restante 0 100%
Santé inconnu good
État en ligne du chargeur secteur 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 d'une HAL Health.

Android 9 et versions ultérieures

Android 9 supprime certains codes précédents 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 apparaît avec un point d'exclamation et le pourcentage de batterie est indiqué comme étant de 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 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 de framework Android considèrent que le système est 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 apparaît avec un point d'exclamation et le pourcentage de batterie est indiqué comme étant de 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 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 au noyau ou à la HAL pour refléter avec précision l'état de l'alimentation et de la batterie de votre produit, comme décrit précédemment. Si Android 9 et versions ultérieures ne détectent pas de chargeur de classe d'alimentation Linux, tous les types de chargeur (secteur, USB, sans fil) auront par défaut l'état hors connexion. Si tous les chargeurs sont hors connexion, mais qu'aucun appareil de batterie n'est détecté, le système sera toujours considéré comme en charge, car il fonctionne sur une alimentation externe et non sur batterie, comme décrit précédemment.

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

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 de HAL Health et modifiez-le conformément à la HAL Health AIDL.