Как определяется состояние батареи Android?

Я не говорю о том, как читать значение.

Скорее меня интересует, как устанавливается значение BatteryManager.EXTRA_HEALTH.

Это из прошивки? Конкретный производитель?

Что определяет эти значения?

int BATTERY_HEALTH_COLD 
int BATTERY_HEALTH_DEAD 
int BATTERY_HEALTH_GOOD 
int BATTERY_HEALTH_OVERHEAT 
int BATTERY_HEALTH_OVER_VOLTAGE 
int BATTERY_HEALTH_UNKNOWN  
int BATTERY_HEALTH_UNSPECIFIED_FAILURE

Спасибо, Саймон


person simonso    schedule 11.04.2012    source источник
comment
Это должно перейти на android.stackexchange.com   -  person Abhishek Chanda    schedule 11.04.2012
comment
Что означает BATTERY_HEALTH_COLD? батарея может быть слишком холодной? какой ущерб это наносит?   -  person android developer    schedule 16.10.2014
comment
Когда аккумулятор холодный, он не может обеспечить столько тока.   -  person SytS    schedule 05.11.2014


Ответы (3)


Чтобы быть более конкретным: состояние батареи определяется драйвером (в ядре). Указанный драйвер экспортирует информацию через файловую систему sys (точнее, /sys/class/power_supply). Демон Healthd Android (начиная с KK, 4.4.x) получает эту информацию и реализует на ней интерфейс IBatteryPropertiesRegistrar. Он постоянно опрашивает (используя epoll_wait для запуска в цикле тайм-аута для периодических обновлений, а также уведомлений netlink для подсистемы POWER — например, если вы подключаете или отключаете зарядное устройство). Системная служба BatteryStatsService затем регистрирует слушателя в Healthd (через связующее), а затем получает данные, опубликованные Healthd,

Проверьте /sys/class/power_supply, и вы увидите:

lrwxrwxrwx root     root              1970-02-05 14:20 ac -> ../../devices/f9923000.i2c/i2c-84/84-006b/power_supply/ac
lrwxrwxrwx root     root              1970-02-05 14:20 batt_therm -> ../../devices/battery_tm_ctrl.78/power_supply/batt_therm
lrwxrwxrwx root     root              1970-02-05 14:20 battery -> ../../devices/f9923000.i2c/i2c-84/84-0036/power_supply/battery
lrwxrwxrwx root     root              1970-02-05 14:20 touch -> ../../devices/virtual/power_supply/touch
lrwxrwxrwx root     root              1970-02-05 14:20 usb -> ../../devices/msm_dwc3/power_supply/usb
lrwxrwxrwx root     root              1970-02-05 14:20 wireless -> ../../devices/bq51013b_wlc.77/power_supply/wireless

затем проверьте "батарея"

/sys/devices/f9923000.i2c/i2c-84/84-0036/power_supply/battery:
-r--r--r-- root     root         4096 2014-02-26 13:26 capacity
-r--r--r-- root     root         4096 2014-02-26 13:26 charge_full_design
-r--r--r-- root     root         4096 2014-02-26 13:26 current_now
lrwxrwxrwx root     root              2014-02-26 13:26 device -> ../../../84-0036
-r--r--r-- root     root         4096 2014-02-26 13:26 health
drwxr-xr-x root     root              2014-02-26 13:26 power
-r--r--r-- root     root         4096 2014-02-26 13:26 present
-r--r--r-- root     root         4096 2014-02-26 13:26 status
lrwxrwxrwx root     root              2014-02-26 13:26 subsystem -> ../../../../../../class/power_supply
-r--r--r-- root     root         4096 2014-02-26 13:26 technology
-r--r--r-- root     root         4096 2014-02-26 13:26 temp
-r--r--r-- root     root         4096 2014-02-26 13:26 type
-rw-r--r-- root     root         4096 2014-02-26 13:26 uevent
-r--r--r-- root     root         4096 2014-02-26 13:26 voltage_max_design
-r--r--r-- root     root         4096 2014-02-26 13:26 voltage_min_design
-r--r--r-- root     root         4096 2014-02-26 13:26 voltage_now

и, просмотрев файлы, все детали будут раскрыты.

person Technologeeks    schedule 12.08.2014

Используя этот код, вы можете получить информацию о батарее.

private BroadcastReceiver battery_receiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        boolean isPresent = intent.getBooleanExtra("present", false);
        String technology = intent.getStringExtra("technology");
        int plugged = intent.getIntExtra("plugged", -1);
        int scale = intent.getIntExtra("scale", -1);
        int health = intent.getIntExtra("health", 0);
        int status = intent.getIntExtra("status", 0);
        int rawlevel = intent.getIntExtra("level", -1);
        int level = 0;
        String temp=null;

        Bundle bundle = intent.getExtras();

        Log.i("BatteryLevel", bundle.toString());

        if(isPresent)
        {
            if (rawlevel >= 0 && scale > 0) {
                level = (rawlevel * 100) / scale;
            }

            String info = "Battery Level: " + level + "%\n";

            info += ("Technology: " + technology + "\n");
            info += ("Plugged: " + getPlugTypeString(plugged) + "\n");
            info += ("Health: " + getHealthString(health) + "\n");
            info += ("Status: " + getStatusString(status) + "\n");
            info += ("Temp: "+getTempStatus(temp,intent)+"\n");

            setBatteryLevelText(info + "\n\n" + bundle.toString());
        }
        else
        {
            setBatteryLevelText("Battery not present!!!");
        }
    }
};
private void registerBatteryLevelReceiver(){
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

    registerReceiver(battery_receiver, filter);
}
person Sandeep    schedule 11.04.2012
comment
Спасибо, но мой первоначальный вопрос заключается в том, кто определил значение, возвращаемое намерением.getIntExtra(health, 0). Предыдущий ответ имел смысл, это от бортового компьютера литий-ионного аккумулятора. Я ищу, как эта часть делается. - person simonso; 11.04.2012

Литий-ионные аккумуляторы имеют простые бортовые компьютеры, которые отслеживают и сообщают о состоянии; индикаторы состояния стандартизированы, но условия, при которых батарея сообщает о них, определяются производителем батареи.

person geekosaur    schedule 11.04.2012
comment
Большое спасибо! Я очень ценю ваш ответ - это начинает иметь смысл! Еще несколько вопросов: 1) есть ли в андроиде какой-то код прослушивателя событий, который бы подхватывал отчет с бортового компьютера в аккумуляторе? Не могли бы вы привести мне пример? 2) если нет, то это делается на уровне прошивки? 3) Должен ли сторонний производитель аккумуляторов (не OEM) соответствовать определенной спецификации, чтобы имитировать отчетность? - person simonso; 11.04.2012
comment
Я не знаю подробностей об Android; Я говорил в целом о литий-ионных батареях, которые почти все одинаковы (им нужна интеллектуальная схема зарядного устройства, но эта схема должна быть настроена для батареи, поэтому она является частью батареи). Предлагаем задать вопрос на android.stackexchange.com. - person geekosaur; 11.04.2012