5

我正在尝试获取正在运行的应用程序的列表以及每个应用程序使用的电池量。我google了很长时间,但没有提出解决方案。但是,PowerProfile、PowerUsageSummary 内部类有一些参考资料。

我通过反射技术使用它们,但没有得到我想要的东西。PowerUsageSummary 显示的详细信息与您通过转到设备设置->应用程序->电池使用(这是在 Samsund 设备中可以看到的方式)看到的相同。

然后我使用了 PowerProfile 类,但我只得到了 WIFI、AUDIO、VIDEO、GPS、BLUETOOTH 等使用的电流 mA(mA 值不会经常变化。我不确定这些值是否正确)。另一个参考是 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

首先请注意,除非您安装在系统映像上并且可以持有 BATTERY_STATS 权限,否则您无法使用此 API。这不适用于与系统分开安装的第三方应用程序。

要使用它,您不需要直接实例化 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 回答