Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓电池信息问题_Java_Android_Battery - Fatal编程技术网

Java 安卓电池信息问题

Java 安卓电池信息问题,java,android,battery,Java,Android,Battery,我使用下面的代码来获得电池在两个不同时间(t1,t2)的电压。t1在任务执行之前,t2在任务执行之后。所以根据规则,t2必须小于t1 然而,在执行过程中,情况并非如此。我得到了多个值,它们更大,更小,等于t1。这怎么可能呢?即使在android电池监控工具中,我也注意到有时电池的总mAh值在不插入充电器的情况下会增加几点 public void onCreate() { BroadcastReceiver batteryReceiver = new BroadcastReceiver()

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

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_数据中有以下目录