Android电池信息问题

时间:2013-03-09 23:55:45

标签: java android battery

我使用以下代码在两个不同的时间(t1,t2)获取电池电压。 t1在执行任务之前,t2在执行任务之后。因此,按规则,t2必须小于t1。

然而,在执行中并非如此。我得到多个值,更大,更小,等于t1。怎么可能这样呢?即使在Android电池监控工具中,我也注意到有时总电池mAh值会增加几个点而不会堵塞充电器。

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);
}

2 个答案:

答案 0 :(得分:1)

Android框架不断从其power_supply子系统获取信息。因此,在更新后,它将发出BATTERY_STATE_CHANGED意图。

private void updateLocked() {
    if (!mUpdatesStopped) {
        // Update the values of mAcOnline, et. all.
        native_update();

        // Process the new values. Sendout the intent
        processValuesLocked();
    }
}

但它只是在一段时间后更新信息。所以它可能包含一定程度的不准确性。

在native_update的实现中。 Android只会在/sys/class/power_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

请注意,voltage_now是微伏,而不是毫伏。

如果您愿意,也可以以编程方式阅读。

然而,它可能仍然不够准确,因为这些数据的内容由opearting系统更新(可能类似于电源驱动程序),因此对于非常准确的统计数据,您可能必须尝试硬件方法。) / p>

答案 1 :(得分:0)

How could this be possible?
电池mAh值是作为电池的电压测量的。但是这个电压会不时变化。当有高电流消耗时它会下降一点,然后在处理器空闲时返回。它也随温度变化而变化。总的来说,这是非常不准确的。