在android中使用通过Reflection的BatteryStatsImpl内部类

Van*_*nsi 5 android

我正在尝试获取正在运行的应用程序列表以及每个应用程序使用的电池数量.我有谷歌很长一段时间,但没有想出一个解决方案.但是,有一些关于PowerProfile,PowerUsageSummary内部类的参考资料.

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

然后我使用了PowerProfile类,但我只获得了WIFI,音频,视频,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);
Run Code Online (Sandbox Code Playgroud)

hac*_*bod 7

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

要使用它,不要直接实例化BatteryStatsImpl.您可以从BatteryStatsService收集的当前统计信息中请求它的实例.您可以查找设置应用的源代码,了解如何执行此操作:https://code.google.com/p/android-source-browsing/source/browse/src/com/android/settings/fuelgauge/PowerUsageSummary的.java回购=平台-封装-应用-设置

特别是:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)