如何确定Android电池的运行状况?
我不是说如何读取值 相反,我感兴趣的是如何设置BatteryManager.EXTRA_HEALTH的值 它是否来自固件?特定制造商 什么决定了这些值如何确定Android电池的运行状况?,android,power-management,Android,Power Management,我不是说如何读取值 相反,我感兴趣的是如何设置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 BATT
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
谢谢,
西蒙锂离子电池拥有简单的车载电脑,可以跟踪和报告健康状况;状态指示器是标准化的,但触发它们由电池报告的条件由电池制造商确定。使用此代码,您可以获得有关电池的信息
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);
}
更具体地说:电池运行状况由驱动程序(在内核中)决定。所述驱动程序通过sys文件系统(/sys/class/power\u supply,确切地说)导出信息。Android守护进程healthd(从KK,4.4.x开始)获取此信息,并在其上实现IBatteryPropertiesRegistrar接口。它会连续轮询(使用epoll_wait在超时循环中运行以进行定期更新,以及电源子系统的netlink通知,例如,如果您连接或断开充电器)。系统的BatteryStatsService然后向healthd注册一个侦听器(通过binder),然后获取healthd发布的数据 查看/sys/class/power\u 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
然后看看“电池”
通过查看这些文件,所有细节都会被披露。这应该转到android.stackexchange.com“电池健康”是什么意思?电池可能太冷了?它会造成什么损坏?当电池冷的时候,它不能提供那么多的电流。非常感谢!我真的很感激你的回答——这开始有意义了!还有几个问题:1)android是否有一些事件监听器代码,可以从电池中的车载计算机获取报告?你能给我举个例子吗?2) 如果没有,是否在固件级别执行此操作?3) 第三方电池制造商(非OEM制造商)是否必须符合特定规范以模仿报告?我不知道有关Android的详细信息;我说的是一般的锂离子电池,它们几乎都是一样的(它们需要智能充电器电路,但电路需要针对电池进行调整,所以它是电池的一部分)。建议您继续提问。谢谢,但我最初的问题是,谁确定了intent.getIntExtra(“health”,0)返回的值。前面的答案是有道理的,它来自于锂离子电池的车载计算机。我正在寻找这一部分是如何完成的。
/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