5

実行中のアプリケーションと各アプリケーションで使用されているバッテリーの量のリストを取得しようとしています。私は長い間グーグルを持っていますが、解決策を思いつきませんでした。ただし、PowerProfile、PowerUsageSummary内部クラスに関するいくつかの参照があります。

リフレクションテクニックで使用しましたが、探していたものが得られませんでした。PowerUsageSummaryは、[デバイスの設定]->[アプリケーション]->[バッテリーの使用]に移動して表示されるのと同じ詳細を表示します(これは、Samsundデバイスで表示される方法です)。

次に、PowerProfileクラスを使用しましたが、WIFI、AUDIO、VIDEO、GPS、BLUETOOTHなどで使用される電流のmAしか取得できませんでした(mA値はそれほど頻繁には変更されません。値が正しいかどうかはわかりません)。もう1つの参照は、BatteryStatsImplクラスでした。このクラスをテストしましたが、値は常に0です。それでも、実行中のアプリケーションのリストと、各アプリケーションで使用されているバッテリーの量を探しています。どんな助けでも大歓迎です。

ありがとう、

これが私がBatteryStatsImplクラスのために試したサンプルコードです。

        String BATTERY_PROFILE_CLASS = "com.android.internal.os.BatteryStatsImpl";
        Object mBatteryProfile = Class.forName(BATTERY_PROFILE_CLASS).getConstructor().newInstance();
        Method batteryMeth = Class.forName(BATTERY_PROFILE_CLASS).getMethod("getBatteryUptime", long.class);
        Object arglist1[] = new Object[1];
        arglist1[0] = System.currentTimeMillis();
        // This is to calculate the batteryUpTime since the current time.
        Long batteryUptime = (Long) batteryMeth.invoke(mBatteryProfile, arglist1);

        Method dischargeMeth = Class.forName(BATTERY_PROFILE_CLASS).getMethod("getDischargeStartLevel");
        // This is to calculate the dischargeTime of the device battery
        Integer dischargeTime = (Integer) dischargeMeth.invoke(mBatteryProfile);
4

2 に答える 2

7

まず、システムイメージにインストールされていない限り、このAPIを使用できないことに注意してください。そのため、BATTERY_STATS権限を保持できます。これは、システムとは別にインストールされたサードパーティのアプリでは利用できません。

これを使用するために、BatteryStatsImplを直接インスタンス化することはありません。BatteryStatsServiceによって収集されている現在の統計からそのインスタンスをリクエストします。これを行う方法については、設定アプリのソースコードを探すことができます:https ://code.google.com/p/android-source-browsing/source/browse/src/com/android/settings/fuelgauge/PowerUsageSummary .java?repo = platform--packages--apps--settings

特に:

import android.os.BatteryStats;

import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BatteryStatsImpl;

IBatteryStats mBatteryInfo;
UserManager mUm;
BatteryStatsImpl mStats;

mBatteryInfo = IBatteryStats.Stub.asInterface(
        ServiceManager.getService("batteryinfo"));

private void load() {
    try {
        byte[] data = mBatteryInfo.getStatistics();
        Parcel parcel = Parcel.obtain();
        parcel.unmarshall(data, 0, data.length);
        parcel.setDataPosition(0);
        mStats = com.android.internal.os.BatteryStatsImpl.CREATOR
                .createFromParcel(parcel);
        mStats.distributeWorkLocked(BatteryStats.STATS_SINCE_CHARGED);
    } catch (RemoteException e) {
        Log.e(TAG, "RemoteException:", e);
    }
}
于 2013-01-11T17:36:46.870 に答える
0

BatteryStatsServiceは統計を維持します。それを行うためにどのようBatteryStatsImplに使用されているかを見てください(これらのnote*()メソッドは、たとえば画面がオンになったときにシステムによって呼び出されます)

多分あなたはそこから現在の統計を得ることができます

于 2012-04-25T07:19:47.677 に答える