0

次のコードを使用して、2 つの異なる時間 (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);
}
4

2 に答える 2

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 はミリボルトではなくマイクロボルトであることに注意してください。

必要に応じて、プログラムで読み取ることもできます。

ただし、これらのデータの内容はオペレーティング システム (パワー ドライバーのようなものである可能性があります) によって更新されるため、まだ十分に正確ではない可能性があります。そのため、本当に正確な統計を得るには、ハードウェア アプローチを試す必要がある場合があります。:)

于 2013-03-10T00:36:16.440 に答える
0

How could this be possible?
バッテリーの mAh 値は、バッテリーからの電圧として測定されます。しかし、この電圧は時々変化します。消費電流が大きい場合は少し低下し、たとえばプロセッサがアイドル状態の場合は元に戻ります。また、温度変化で変化します。したがって、全体として非常に不正確です。

于 2013-03-10T00:39:23.360 に答える