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.
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:
Clef | Désignation | Type retourné |
EXTRA_HEALTH | Etat de santé de la batterie | integer |
EXTRA_ICON_SMALL | ID sur une icône représentant le niveau de charge de la batterie | integer |
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_PRESENT | Indique que la batterie est présente ou non | boolean |
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
Valeur | Désignation |
BATTERY_STATUS_CHARGING | En charge |
BATTERY_STATUS_DISCHARGING | Déchargement |
BATTERY_STATUS_FULL | Batterie chargée au maximum |
BATTERY_STATUS_NOT_CHARGING | Batterie 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 !) |
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.
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
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.