web-dev-qa-db-fra.com

Obtenir les valeurs actuelles de la batterie pour le téléphone Android

J'essaie de collecter des statistiques sur la consommation d'énergie du téléphone Android G1. Je suis intéressé à connaître les valeurs de tension et de courant, et ensuite en mesure de collecter des statistiques telles que rapportées dans ce PDF

Je peux obtenir la valeur de la tension de la batterie en enregistrant un récepteur d'intention pour recevoir la diffusion pour ACTION_BATTERY_CHANGED. Mais le problème est qu'Android n'expose pas la valeur de current via cette interface SDK. 

L’un des moyens que j’ai essayé est via l’interface sysfs, où je peux voir la valeur actuelle de la batterie depuis adb Shell, en utilisant la commande suivante

$cat /sys/class/power_supply/battery/batt_current
449 

Mais cela ne fonctionne aussi que si le téléphone est connecté via une interface USB. Si je déconnecte le téléphone, la valeur de batt_current est définie sur «0». Je ne suis pas sûr de savoir pourquoi la valeur du courant rapporté est zéro. Il devrait être plus que zéro, non? 

Des suggestions/indications pour obtenir la valeur actuelle de la batterie? Aussi, corrigez-moi si je me trompe. 

24
Chintan Parikh

Après plusieurs expériences et l’aide de divers autres groupes, j’ai découvert qu’il n’était pas possible d’obtenir la valeur Courant de la batterie uniquement par logiciel (car elle n’est pas prise en charge en h/w). Le seul moyen que j’ai trouvé était de mesurer le courant circulant dans la batterie au moyen d’un multimètre. 

3
Chintan Parikh

Vous pouvez simplement regarder le code source du widget actuel. Il a un chemin codé en dur vers où certaines plateformes stockent les valeurs actuelles.

/*
 *  Copyright (c) 2010-2011 Ran Manor
 *  
 *  This file is part of CurrentWidget.
 *    
 *  CurrentWidget is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  CurrentWidget is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with CurrentWidget.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.manor.currentwidget.library;

import Java.io.File;

import Android.os.Build;
import Android.util.Log;

public class CurrentReaderFactory {

    static public Long getValue() {

        File f = null;      

        // htc desire hd / desire z / inspire?
        if (Build.MODEL.toLowerCase().contains("desire hd") ||
                Build.MODEL.toLowerCase().contains("desire z") ||
                Build.MODEL.toLowerCase().contains("inspire")) {

            f = new File("/sys/class/power_supply/battery/batt_current");
            if (f.exists()) {
                return OneLineReader.getValue(f, false);
            }
        }

        // nexus one cyangoenmod
        f = new File("/sys/devices/platform/ds2784-battery/getcurrent");
        if (f.exists()) {
            return OneLineReader.getValue(f, true);
        }

        // sony ericsson xperia x1
        f = new File("/sys/devices/platform/i2c-adapter/i2c-0/0-0036/power_supply/ds2746-battery/current_now");
        if (f.exists()) {
            return OneLineReader.getValue(f, false);
        }

        // xdandroid
        /*if (Build.MODEL.equalsIgnoreCase("MSM")) {*/
            f = new File("/sys/devices/platform/i2c-adapter/i2c-0/0-0036/power_supply/battery/current_now");
            if (f.exists()) {
                return OneLineReader.getValue(f, false);
            }
        /*}*/

        // droid eris
        f = new File("/sys/class/power_supply/battery/smem_text");      
        if (f.exists()) {
            Long value = SMemTextReader.getValue();
            if (value != null)
                return value;
        }

        // htc sensation / evo 3d
        f = new File("/sys/class/power_supply/battery/batt_attr_text");
        if (f.exists())
        {
            Long value = BattAttrTextReader.getValue();
            if (value != null)
                return value;
        }

        // some htc devices
        f = new File("/sys/class/power_supply/battery/batt_current");
        if (f.exists())
            return OneLineReader.getValue(f, false);

        // nexus one
        f = new File("/sys/class/power_supply/battery/current_now");
        if (f.exists())
            return OneLineReader.getValue(f, true);

        // samsung galaxy vibrant       
        f = new File("/sys/class/power_supply/battery/batt_chg_current");
        if (f.exists())
            return OneLineReader.getValue(f, false);

        // sony ericsson x10
        f = new File("/sys/class/power_supply/battery/charger_current");
        if (f.exists())
            return OneLineReader.getValue(f, false);

        // Nook Color
        f = new File("/sys/class/power_supply/max17042-0/current_now");
        if (f.exists())
            return OneLineReader.getValue(f, false);

        return null;
    }
}
13
Kevin Parker

À partir de l’API 21, nous pouvons obtenir le courant instantané de la batterie en microampères, sous forme d’entier. Documentation développeur

BatteryManager mBatteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);
    Long avgCurrent = null, currentNow = null;
    if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop) {
        avgCurrent = mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE);
        currentNow = mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW);
    }
    Log.d(TAG, "BATTERY_PROPERTY_CURRENT_AVERAGE = " + avgCurrent + "mAh");
    Log.d(TAG, "BATTERY_PROPERTY_CURRENT_NOW =  " + currentNow + "mAh");

En utilisant mBatteryManager, vous pouvez obtenir la lecture actuelle instantanée.

Appareil de mesure Consommation électrique et consommation de lecture et propriétés disponibles sur les appareils NEXUS. Documents open source Android

6
LokiDroid

en utilisant cette fonction, vous obtenez le courant de température-tension dans tous les appareils.

dans OnCreate pour enregistrer un destinataire de diffusion

    this.registerReceiver(this.BatteryInfo, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

et créer un récepteur de diffusion

    private BroadcastReceiver BatteryInfo = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctxt, Intent intent) {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);

        boolean isPresent = intent.getBooleanExtra("present", false);

        Bundle bundle = intent.getExtras();
        String str = bundle.toString();
        Log.i("Battery Info", str);

        if (isPresent) {
            int percent = (level * 100) / scale;

            technology.setText("Technology: "+bundle.getString("technology"));
            voltage.setText("Voltage: "+bundle.getInt("voltage")+"mV");
            temp.setText("Temperature: "+bundle.getInt("temperature"));
            curent.setText("Current: "+bundle.getInt("current_avg"));
            health.setText("Health: "+getHealthString(health_));
            charging.setText("Charging: "+getStatusString(status) + "(" +getPlugTypeString(pluggedType)+")");
            battery_percentage.setText("" + percent + "%");


        } else {
            battery_percentage.setText("Battery not present!!!");
        }
    }   
};


 private String getPlugTypeString(int plugged) {
    String plugType = "Unknown";

    switch (plugged) {
    case BatteryManager.BATTERY_PLUGGED_AC:
        plugType = "AC";
        break;
    case BatteryManager.BATTERY_PLUGGED_USB:
        plugType = "USB";
        break;
    }
    return plugType;
}

private String getHealthString(int health) {
    String healthString = "Unknown";
    switch (health) {
    case BatteryManager.BATTERY_HEALTH_DEAD:
        healthString = "Dead";
        break;
    case BatteryManager.BATTERY_HEALTH_GOOD:
        healthString = "Good Condition";
        break;
    case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
        healthString = "Over Voltage";
        break;
    case BatteryManager.BATTERY_HEALTH_OVERHEAT:
        healthString = "Over Heat";
        break;
    case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
        healthString = "Failure";
        break;
    }
    return healthString;
}
private String getStatusString(int status) {
    String statusString = "Unknown";

    switch (status) {
    case BatteryManager.BATTERY_STATUS_CHARGING:
        statusString = "Charging";
        break;
    case BatteryManager.BATTERY_STATUS_DISCHARGING:
        statusString = "Discharging";
        break;
    case BatteryManager.BATTERY_STATUS_FULL:
        statusString = "Full";
        break;
    case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
        statusString = "Not Charging";
        break;
    }
    return statusString;
}
4
Sumit

j'ai trouvé ce code sur le site de développement Intel Android

public class BatteryActivity extends Activity {

    private final String TAG = "SDP_BATTERY";
    private final String DEGREE_UNICODE = "\u00B0";

    private StringBuffer textBuffer = new StringBuffer();

    // a text view to show the status of the battery
    private TextView mStatusTextView;
    // a text view to display the battery status icon
    private TextView mBatteryStatusIcon;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.battery);

        mBatteryStatusIcon = (TextView) this.findViewById(R.id.statusBattIcon);
        mStatusTextView = (TextView) this.findViewById(R.id.statusEditText);
    }

    /**
     * Once onResume is called, the activity has become visible (it is now "resumed"). Comes after onCreate
     */
    protected void onResume() {
        super.onResume();

        IntentFilter filter = new IntentFilter();

        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        Log.d(TAG, "Register battery status receiver.");
        registerReceiver(mBroadcastReceiver, filter);
    }

    /**
     * Another activity takes focus, so this activity goes to "paused" state
     */
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "Unegister battery status receiver.");
        unregisterReceiver(mBroadcastReceiver);
    }

    /**
     * BroadcastReceiver is used for receiving intents (broadcasted messages) from the BatteryManager
     */
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

        private boolean isHealth = false;

        public void onReceive(Context context, Intent intent) {
            DecimalFormat formatter = new DecimalFormat();

            String action = intent.getAction();

            // store battery information received from BatteryManager
            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                Log.d(TAG, "Received battery status information.");
                int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, 0);
                int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, 0);
                boolean present = intent.getBooleanExtra(
                        BatteryManager.EXTRA_PRESENT, false);
                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0);
                int icon_small = intent.getIntExtra(
                        BatteryManager.EXTRA_ICON_SMALL, 0);
                int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,
                        0);
                int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,
                        0);
                int temperature = intent.getIntExtra(
                        BatteryManager.EXTRA_TEMPERATURE, 0);
                String technology = intent
                        .getStringExtra(BatteryManager.EXTRA_TECHNOLOGY);

                // display the battery icon that fits the current battery status (charging/discharging)
                mBatteryStatusIcon.setCompoundDrawablesWithIntrinsicBounds(icon_small, 0, 0, 0);

                // create TextView of the remaining information , to display to screen.
                String statusString = "";

                switch (status) {
                case BatteryManager.BATTERY_STATUS_UNKNOWN:
                    statusString = "unknown";
                    break;
                case BatteryManager.BATTERY_STATUS_CHARGING:
                    statusString = "charging";
                    break;
                case BatteryManager.BATTERY_STATUS_DISCHARGING:
                    statusString = "discharging";
                    break;
                case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                    statusString = "not charging";
                    break;
                case BatteryManager.BATTERY_STATUS_FULL:
                    statusString = "full";
                    break;
                }

                String healthString = "";

                switch (health) {
                case BatteryManager.BATTERY_HEALTH_UNKNOWN:
                    healthString = "unknown";
                    break;
                case BatteryManager.BATTERY_HEALTH_GOOD:
                    healthString = "good";
                    isHealth = true;
                    break;
                case BatteryManager.BATTERY_HEALTH_OVERHEAT:
                    healthString = "overheat";
                    break;
                case BatteryManager.BATTERY_HEALTH_DEAD:
                    healthString = "dead";
                    break;
                case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
                    healthString = "over voltage";
                    break;
                case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
                    healthString = "unspecified failure";
                    break;
                }

                String acString = "";

                switch (plugged) {
                case BatteryManager.BATTERY_PLUGGED_AC:
                    acString = "plugged AC";
                    break;
                case BatteryManager.BATTERY_PLUGGED_USB:
                    acString = "plugged USB";
                    break;
                default:
                    acString = "not plugged";
                }

                textBuffer =  new StringBuffer();
                textBuffer.append("status:" + statusString + "\n");

                formatter.applyPattern("#");
                String levelStr = formatter.format( (float)level/scale * 100 );
                textBuffer.append("level:" + levelStr + "% (out of 100)\n");
                textBuffer.append("health:" + healthString + "\n");

                textBuffer.append("present?:" + String.valueOf(present) + "\n");

                textBuffer.append("plugged?:" + acString + "\n");

                // voltage is reported in millivolts
                formatter.applyPattern(".##");
                String voltageStr = formatter.format( (float)voltage/1000 );
                textBuffer.append("voltage:" + voltageStr + "V\n");

                // temperature is reported in tenths of a degree Centigrade (from BatteryService.Java)
                formatter.applyPattern(".#");
                String temperatureStr = formatter.format( (float)temperature/10 );
                textBuffer.append("temperature:" + temperatureStr
                        + "C" + DEGREE_UNICODE + "\n");

                textBuffer.append("technology:" + String.valueOf(technology)
                        + "\n");

                mStatusTextView.setText(textBuffer.toString());

                if (isHealth) {
                    Log.d(TAG, "Battery health: " + healthString);
                    Log.d(TAG, "UMSE_BATTERY_SUCCESSFULLY");
                } else {
                    Log.d(TAG, "UMSE_BATTERY_FAILED");
                }

                Log.d(TAG, textBuffer.toString());

                //finish();
            }
        }
    };
3
Avinash

essayez ce code, peut-être que ce serait une aide complète pour vous:

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
      @Override
      public void onReceive(Context arg0, Intent intent) {
        // TODO Auto-generated method stub
          //this will give you battery current status
        int level = intent.getIntExtra("level", 0);

        contentTxt.setText(String.valueOf(level) + "%");

        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        textView2.setText("status:"+status);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;
        textView3.setText("is Charging:"+isCharging);
        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        textView4.setText("is Charge plug:"+chargePlug);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;

        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
        textView5.setText("USB Charging:"+usbCharge+" AC charging:"+acCharge);

      }
    };

en classe principale enregistrez ceci en utilisant:

 this.registerReceiver(this.mBatInfoReceiver, 
          new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
1
Hamad

La plupart des batteries utilisent le courant sortant de la batterie pour déterminer le%, bien qu'il soit rarement disponible pour les développeurs! 

Nécessite un noyau modifié sur ces périphériques.

C'est le cas du Galaxy S2 dont les puces mesurent un tel flux de courant! Mais c'est "désactivé" dans le noyau de stock. Cela signifie qu'il est supprimé de l'interface sysfs et utilisé uniquement en interne par la batterie.

Néanmoins, vous pouvez essayer l'application Battery Monitor Widget de Market, qui prend en charge de nombreux téléphones et estime le courant en mA lorsqu'elle n'est pas disponible. La prise en charge de nouveaux téléphones et méthodes est régulièrement ajoutée pour améliorer les lectures.

Sur le Galaxy Nexus, la puce actuelle a été complètement retirée car la batterie utilise maintenant des calculs avancés pour déterminer les%, qui ne nécessitent pas de données actuelles. Le résultat est que ce téléphone n’a pas de courbe d’apprentissage (

0
3c71

Pour le pourcentage de charge de la batterie, vous pouvez utiliser les éléments suivants:

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

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

float batteryPct = level / (float)scale;

TextView tView = (TextView) findViewById(R.id.textView2);
tView.setText("Battery Status " + batteryPct);
0
AnilKumar Bedide