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?

Mohit Deshpande
la source
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));
  }
}
SirDarius
la source
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);
marque
la source
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);
   }
}
blueware
la source
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 .

bk138
la source
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);
    }
reza.cse08
la source
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)));
  }
Milan Pithadia
la source
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;
}
Espion de code
la source
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);
    }
Hardip
la source
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);
user2212515
la source
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;
FindOutIslamNow
la source