Déterminer l'état de la batterie

 

Introduction

Suivant votre application, il peut s'avérer important de vérifier l'état de la batterie avant de lancer certains traitements qui peuvent être gourmands en énergie électrique:

- Prise de photos ou pire de vidéos

- Mise à jour demandant des accès au réseau wifi ou 3g, 4g, ...

- Flash...

Bref tout ce qui peut être énergivore !

 

Changement d'état de la batterie

Une première solution pour connaître l'état de la batterie est d'utiliser le broadcast ACTION_BATTERY_CHANGED. Cette solution permettra d'avoir des informations détaillées sur la batterie.

Le broadcast utilisé est particulier, car il s'agit d'une sticky intent, c'est à dire d'une intention dont le résultat est toujours disponible. Il n'est donc pas nécessaire d'enregistrer un BroadcastReceiver.

Image non trouvée !De ce fait, il n'existe pas de android.intent.action.BATTERY_CHANGED. Vous ne pouvez donc pas vous enregistrer à ce broadcast depuis le fichier AndroidManifest.xml !

Ce broadcast retourne les informations suivantes de l'intention dans l'extra data.

Ces informations (constantes, chaînes de caractères) sont codées dans la classe BatteryManager.

 

Voici les informations supplémentaires disponibles sur une batterie:

ClefDésignationType retourné
EXTRA_HEALTH Etat de santé de la batterie integer
EXTRA_ICON_SMALLID sur une icône représentant le niveau de charge de la batterieinteger
EXTRA_LEVEL Niveau de charge de la batterie de 0 (vide) à EXTRA_SCALE (max. charge). Ce n'est donc pas forcement un pourcentage...(la prochaine API 21 devrait donner la valeur en %). Sinon, pour le convertir en pourcentage: level / (float) scale... integer
EXTRA_PLUGGED Indique que la batterie est en charge est précise la source (0, l'appareil est sur batterie uniquement, donc pas de charge !). integer
EXTRA_PRESENTIndique que la batterie est présente ou nonboolean
EXTRA_SCALE Valeur maximum de la charge de la batterie integer
EXTRA_STATUS Status de la charge de la batterie integer
EXTRA_TECHNOLOGY Technologie utilisée dans la batterie, par exemple Lithium-ion qui donne Li-ion string
EXTRA_TEMPERATURE Températue de la batterie en °C integer
EXTRA_VOLTAGE Tension au borne de la batterie en mV integer

Cf. extra data d'une intention.

 

Batterie en charge ou chargée

Vous trouverez souvent ce genre de code pour savoir rapidement si la batterie est chargée ou en charge:

C'est un première réponse possible pour savoir si vous pouvez ou non effectruer un traitement consommateur d'énergie...

 

Etat de charge

ValeurDésignation
BATTERY_STATUS_CHARGINGEn charge
BATTERY_STATUS_DISCHARGINGDéchargement
BATTERY_STATUS_FULLBatterie chargée au maximum
BATTERY_STATUS_NOT_CHARGINGBatterie non en charge
BATTERY_STATUS_UNKNOWN quesaco qui se passe ? Le système ne reconnais pas l'état de la batterie...

 

Etat de santé

Valeur Désignation
BATTERY_HEALTH_COLD Batterie froide
BATTERY_HEALTH_DEAD Batterie morte
BATTERY_HEALTH_GOOD Batterie en bon état
BATTERY_HEALTH_OVERHEAT Batterie en surchauffe
BATTERY_HEALTH_OVER_VOLTAGE Batterie en surcharge
BATTERY_HEALTH_UNKNOWN Etat inconnu
BATTERY_HEALTH_UNSPECIFIED_FAILURE Il y a un défaut, mais non reconnu par le système

 

Type de charge

Valeur Désignation
BATTERY_PLUGGED_AC En charge sur le secteur
BATTERY_PLUGGED_USB En charge à partir d'un port USB
BATTERY_PLUGGED_WIRELESS En charge par induction (API 17 !)

Image non trouvée !Une valeur particulière:0, la batterie n'est pas en charge...

 

L'icone de charge de la batterie

A priori, vous ferez vous même vos images, mais si vous en avez vraiment besoin...

Vous pouvez afficher l'icone représentant le niveau de charge de la batterie (où le résultat dépendra des appareils):

Et pour rappel, l'objet ImageView.

 

Autres états

D'autres informations sur l'état de la batterie seront disponibles avec le broadcast ACTION_BATTERY_CHANGED dans les versions suivantes d'Android:

http://developer.android.com/reference/android/os/BatteryManager.html

 

Exemple de code

Simple code affichant dans une log les différentes informations sur l'état de la batterie.

 

Etre informé de certaines modifications de l'état de la batterie

La seconde solution consiste à être informé de façon plus précise sur certaines modifications de l'état de la batterie:

Actuellement, les changements d'état se feront sur la batterie en charge ou non, le niveau bas de la charge de la batterie, ou niveau ok suite à une information de niveau bas.

Depuis votre code, vous pouvez vous enregistrer avec:

String ACTION_POWER_CONNECTED: l'appareil est connecté à une source d'énergie externe.
String ACTION_POWER_DISCONNECTED: L'appareil est de la source d'énergie externe.

String ACTION_BATTERY_LOW Broadcast Action: La batterie à un niveau de charge qui est faible (déclenché autour de 15% de charge).
String ACTION_BATTERY_OKAY Broadcast Action: La batterie est repassée à un niveau de charge correcte (après être passée à un niveau faible, autour de 20%).

 

Ou l'équivalent si vous enregistrez votre broadcast receiver depuis le fichier AndroidManifest.xml:

android.intent.action.ACTION_POWER_CONNECTED

android.intent.action.ACTION_POWER_DISCONNECTED

android.intent.action.BATTERY_LOW

android.intent.action.BATTERY_OKAY

 

Evidement, il s'agit de broadcasts qui seront envoyés. Mais contrairement à ACTION_BATTERY_CHANGED qui est en fait un sticky intent, ici, il s'agira de broadcast intent. Il faudra donc développer des broadcast receivers.

Image non trouvée !Il n'y a pas de permission particulière à poser pour recevoir ces infomations du système.

 

Exemple

Premier exemple:

Voici un exemple de code pour savoir quand l'appareil est connecté/déconnecté à une source externe d'énergie:

 

Le code du broadcast receiver pour les messages ACTION_POWER_CONNECTED et ACTION_POWER_DISCONNECTED

Image non trouvée !Récupération de l'action sur l'intention pour déterminer s'il s'agit d'une connexion ou d'une déconnexion.

Puis la partie qu'il faut ajouter dans la section application du AndroidManifest.xml pour s'abonner aux messages:

Voilà, un beau Toast s'affichera lorsque vous brancherez ou débrancherez votre appareil d'une source externe !

 

Second exemple:

L'équivalent pour le niveau de la batterie

Et la section à ajouter dans AndroidManifest.xml sous la section application

Cette fois-ci, l'affichage de l'information se fera à l'aide de notifications.