Obtenez le niveau et l'état de la batterie sur Android


109

Comment puis-je connaître le niveau et l'état de la batterie (branchée, déchargée, chargée, etc.)? J'ai recherché la documentation du développeur et j'ai trouvé une classe BatteryManager. Mais il ne contient aucune méthode, juste des constantes. Comment puis-je même l'utiliser?


Après quelques recherches supplémentaires, j'ai trouvé BatteryManager.EXTRA_LEVEL.
Mohit Deshpande

Vérifiez cette méthode pour obtenir le pourcentage de batterie ici freakyjolly.com/android-useful-methods-and-functions/#5method
Code Spy

Réponses:


124

Voici un exemple de code qui explique comment obtenir des informations sur la batterie.

Pour résumer, un récepteur de diffusion pour l' ACTION_BATTERY_CHANGEDintention est configuré de manière dynamique, car il ne peut pas être reçu via les composants déclarés dans les manifestes, uniquement en s'enregistrant explicitement avec Context.registerReceiver().

public class Main extends Activity {
  private TextView batteryTxt;
  private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context ctxt, Intent intent) {
      int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
      batteryTxt.setText(String.valueOf(level) + "%");
    }
  };

  @Override
  public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.main);
    batteryTxt = (TextView) this.findViewById(R.id.batteryTxt);
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  }
}

2
À propos de l'intention ACTION_BATTERY_CHANGED: il s'agit d'une diffusion persistante contenant l'état de charge, le niveau et d'autres informations sur la batterie. Vous ne pouvez pas recevoir cela via les composants déclarés dans les manifestes, uniquement en vous inscrivant explicitement pour cela avec Context.registerReceiver ().
classe Android

2
@classAndroid eh bien, oui, c'est explicitement indiqué dans la réponse.
SirDarius

Oui @SirDarius, juste en informer les autres. J'ai d'abord voté pour votre réponse et mis ce commentaire quand je l'ai découvert. :)
classe Android

13
n'oubliez pas de désinscrire onPause ou onDestroy.
Dave Doga Oz

Impossible d'installer le gestionnaire de batterie avec le nouveau Keywork, pourquoi monsieur?
subhashchandru

102

Depuis l'API 21, il est possible d'utiliser les éléments suivants pour obtenir le niveau actuel de la batterie en pourcentage:

BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

66

Sur la base de la documentation Android officielle , vous pouvez utiliser cette méthode dans une classe Helper ou Util pour obtenir le pourcentage de batterie actuel:

public static int getBatteryPercentage(Context context) {

    if (Build.VERSION.SDK_INT >= 21) {

         BatteryManager bm = (BatteryManager) context.getSystemService(BATTERY_SERVICE);
         return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

    } else {

         IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
         Intent batteryStatus = context.registerReceiver(null, iFilter);

         int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
         int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;

         double batteryPct = level / (double) scale;

         return (int) (batteryPct * 100);
   }
}

une erreur dans les documents officiels, vous devez utiliser double à la place float int level = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_LEVEL, -1): -1; int scale = batteryStatus! = null? batteryStatus.getIntExtra (BatteryManager.EXTRA_SCALE, -1): -1; double batteryPct = (double) niveau / (double) échelle; int percent = (int) (batteryPct * 100D);
user2212515

2
@ user2212515, pourriez-vous modifier ma réponse en vous basant sur les documents officiels?
blueware

@ Ryan, j'ai modifié ma réponse pour prendre en charge Android v21 et versions ultérieures. Vérifie s'il te plaît.
blueware

14

Vous n'avez pas besoin d'enregistrer un BroadcastReceiver réel car BatteryManager d'Android utilise une intention persistante:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

return (int)(batteryPct*100);

Ceci provient de la documentation officielle sur https://developer.android.com/training/monitoring-device-state/battery-monitoring.html .


7

Vous pouvez l'utiliser pour obtenir le solde facturé en pourcentage.

private void batteryLevel() {
        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                int level = -1;
                if (rawlevel >= 0 && scale > 0) {
                    level = (rawlevel * 100) / scale;
                }
                batterLevel.setText("Battery Level Remaining: " + level + "%");
            }
        };
        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReceiver, batteryLevelFilter);
    }

5

essayez cette fonction pas besoin de permission ou de n'importe quel destinataire

void getBattery_percentage()
{
      IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
      Intent batteryStatus = getApplicationContext().registerReceiver(null, ifilter);
      int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
      int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
      float batteryPct = level / (float)scale;
      float p = batteryPct * 100;

      Log.d("Battery percentage",String.valueOf(Math.round(p)));
  }

4

Pour vérifier le pourcentage de batterie, nous utilisons BatteryManager , la méthode suivante retournera le pourcentage de batterie.

Lien source

public static float getBatteryLevel(Context context, Intent intent) {
    Intent batteryStatus = context.registerReceiver(null,
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int batteryLevel = -1;
    int batteryScale = 1;
    if (batteryStatus != null) {
        batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, batteryLevel);
        batteryScale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, batteryScale);
    }
    return batteryLevel / (float) batteryScale * 100;
}

hé je l'ai utilisé et parfois le résultat est 89 parfois c'est 00,89 son déplacement des décimales ce qui se passe
Pemba Tamang

1
private void batteryLevel() {
        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                int rawlevel = intent.getIntExtra("level", -1);
                int scale = intent.getIntExtra("scale", -1);
                int level = -1;
                if (rawlevel >= 0 && scale > 0) {
                    level = (rawlevel * 100) / scale;
                }
                mBtn.setText("Battery Level Remaining: " + level + "%");
            }
        };
        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryLevelReceiver, batteryLevelFilter);
    }

1

une erreur dans les documents officiels, vous devez utiliser double à la place float. Parce que 0.53F * 100F = 52F

int level = batteryStatus != null ? 
batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; int scale = 
batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; 
double batteryPct = (double) level / (double) scale; int percent = (int) (batteryPct * 100D);

N'est-ce pas l'erreur 0.53F -> 52F causée par la conversion de la valeur finale en int (supprimant ainsi toute valeur décimale 0.x), au lieu d'utiliser Math.round ()?
Robyer

0

D'autres réponses ne mentionnaient pas comment accéder à l'état de la batterie (chraging ou non).

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.