【问题标题】:Android Battery information issueAndroid 电池信息问题
【发布时间】:2013-03-09 23:55:45
【问题描述】:

我正在使用以下代码来获取电池在两个不同时间 (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);
}

【问题讨论】:

  • 这些值很可能是对当前电池寿命的估计,因此存在不一致之处。
  • 是的,知道如何使它保持一致吗?在这种情况下,我得到的甚至是负值。
  • 发明更好的锂电池技术 =/ 你受制于硬件本身。

标签: java android battery


【解决方案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

请注意,电压现在的单位是微伏,而不是毫伏。

您也可以根据需要以编程方式阅读它。

但是,由于这些数据的内容是由操作系统更新的(可能类似于电源驱动器),因此可能仍然不够准确,因此要获得真正准确的统计数据,您可能必须尝试硬件方法。:)

【讨论】:

  • 亲爱的杰梅因,感谢您提供详细信息。是的,我知道硬件方法,但我现在想避免它。但是,考虑到 /sys/class/power_supply/battery 的东西,我也尝试过。但是由于这个问题没有成功stackoverflow.com/questions/15307365/…
  • 那这些目录下有电压吗?或者你能在power_supply下列出你的目录/文件结构吗?
  • 我在power_supply ac、bq24185、bq27520、chargalg、hsubs_chg和semc_battery_data中有以下目录
【解决方案2】:

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

【讨论】:

  • okies,有什么替代程序可以测量 Android 上进程的能耗吗? (能量水平除外,因为它变化得很晚)。还是我必须使用外部硬件(电源 + 仪表)?
  • @atta 我建议测量此过程所需的处理器时间。从中您可以计算该进程生成的处理器负载等等..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多