首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android电池的健康状况是如何确定的?

Android电池的健康状况是如何确定的?
EN

Stack Overflow用户
提问于 2012-04-11 10:13:30
回答 3查看 14.4K关注 0票数 6

我不是在谈论如何读取值。

相反,我感兴趣的是BatteryManager.EXTRA_HEALTH的值是如何设置的。

它是不是来自固件?特定于制造商?

是什么决定了这些值?

代码语言:javascript
复制
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

谢谢,西蒙

EN

回答 3

Stack Overflow用户

发布于 2014-08-13 00:02:25

更具体地说:电池健康状况由驱动程序(在内核中)决定。所述驱动程序通过sys文件系统(确切地说是/sys/class/power_supply)导出信息。Android守护进程healthd (在KK中是4.4.x)获取了这些信息,并在上面实现了一个IBatteryPropertiesRegistrar接口。它持续轮询(使用epoll_wait在超时循环中运行以获取定期更新,以及电源子系统的netlink通知-例如,如果您连接或断开充电器)。然后,系统的BatteryStatsService向healthd注册一个侦听器(通过绑定器),然后获得healthd发布的数据。

查看/sys/class/power_supply,您将看到:

代码语言:javascript
复制
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

然后看看“电池”

代码语言:javascript
复制
/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

通过查看这些文件,所有细节都会被揭示出来。

票数 7
EN

Stack Overflow用户

发布于 2012-04-11 20:42:58

通过使用此代码,您可以获得有关电池的信息。

代码语言:javascript
复制
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);
}
票数 6
EN

Stack Overflow用户

发布于 2012-04-11 10:18:01

锂离子电池具有简单的板载计算机,用于跟踪和报告健康状况;状态指示器是标准化的,但触发它们由电池制造商报告的条件由电池制造商确定。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10098979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档