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

6

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

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

Это происходит из прошивки? Производитель конкретного?

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

<code>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
</code>

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

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

Ваш Ответ

3   ответа
3

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

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

Чтобы быть более конкретным: состояние батареи определяется драйвером (в ядре). Указанный драйвер экспортирует информацию через файловую систему 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

и, глядя на файлы, все детали будут раскрыты.

5

С помощью этого кода вы можете получить информацию о батарее.

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);
}
Спасибо, но мой оригинальный вопрос: кто определил значение, возвращаемое intent.getIntExtra (& quot; health & quot ;, 0). Предыдущий ответ имел смысл, он был от бортового компьютера литий-ионной батареи. Я ищу, как эта часть делается. simonso

Похожие вопросы