Java 安卓电池信息问题
我使用下面的代码来获得电池在两个不同时间(t1,t2)的电压。t1在任务执行之前,t2在任务执行之后。所以根据规则,t2必须小于t1 然而,在执行过程中,情况并非如此。我得到了多个值,它们更大,更小,等于t1。这怎么可能呢?即使在android电池监控工具中,我也注意到有时电池的总mAh值在不插入充电器的情况下会增加几点Java 安卓电池信息问题,java,android,battery,Java,Android,Battery,我使用下面的代码来获得电池在两个不同时间(t1,t2)的电压。t1在任务执行之前,t2在任务执行之后。所以根据规则,t2必须小于t1 然而,在执行过程中,情况并非如此。我得到了多个值,它们更大,更小,等于t1。这怎么可能呢?即使在android电池监控工具中,我也注意到有时电池的总mAh值在不插入充电器的情况下会增加几点 public void onCreate() { BroadcastReceiver batteryReceiver = new BroadcastReceiver()
public void onCreate() {
BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
int scale = -1;
int level = -1;
int voltage = -1;
int temp = -1;
@Override
public void onReceive(Context context, Intent intent) {
level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
Log.e("BatteryManager", "level is "+level+"/"+scale+", temp is "+temp+", voltage is "+voltage);
}
};
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryReceiver, filter);
}
Android框架不断地从其电源子系统获取信息。因此,在更新之后,它将发送一个电池状态改变的意图
private void updateLocked() {
if (!mUpdatesStopped) {
// Update the values of mAcOnline, et. all.
native_update();
// Process the new values. Sendout the intent
processValuesLocked();
}
}
但它只是在一段时间后更新信息。因此,它可能包含一定程度的不准确
在本机更新的实现中。Android只需读取/sys/class/power\u supply/battery
setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline);
setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline);
setBooleanField(env, obj, gPaths.wirelessOnlinePath, gFieldIds.mWirelessOnline);
setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent);
setIntField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage);
setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature);
因此,如果您需要电压信息,您可以简单地:
$cat /sys/class/power_supply/battery/voltage_now
$cat /sys/class/power_supply/battery/batt_vol
请注意,电压_现在的单位是微伏,而不是毫伏
如果你愿意,你也可以通过程序阅读
但是,由于这些数据的内容是由操作系统更新的(可能类似于电源驱动程序),因此可能仍然不够准确,因此要获得真正准确的统计数据,您可能必须尝试硬件方法。
这怎么可能呢?
蓄电池毫安时值作为蓄电池电压测量。但是这个电压会随着时间而变化。当电流消耗较大时,它会下降一点,当处理器空闲时,它会返回。它也随温度变化而变化。所以总的来说,这是非常不准确的 这些值很可能是对当前电池寿命的估计,因此存在不一致性。你知道如何使其一致吗?在这种情况下,我甚至得到了负值。发明更好的li on technology=/你受硬件本身的摆布。好的,有没有其他方法来测量Android上进程的能耗?(除了能级,因为它变化很晚)。还是必须使用外部硬件(电源+仪表)?@atta我建议测量此过程所需的处理器时间。由此,您可以计算该进程产生的处理器负载,依此类推..亲爱的jermaine,感谢您提供的详细信息。是的,我知道硬件方法,但我现在想避免它。然而,考虑到/sys/class/power_supply/battery的内容,我也尝试过。但是由于这个问题没有成功,那么这些目录下有电压吗?或者您可以在电源设备下列出您的目录/文件结构吗?我在电源设备ac、bq24185、bq27520、chargalg、hsubs_chg和semc_battery_数据中有以下目录