gpt4 book ai didi

android - 在 android 中通过反射使用 BatteryStatsImpl 内部类

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:28:05 25 4
gpt4 key购买 nike

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

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

然后我使用了 PowerProfile 类,但我只得到了 WIFI、音频、视频、GPS、蓝牙等使用的电流的 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);

最佳答案

首先请注意,除非您安装在系统镜像上并拥有 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);
}
}

关于android - 在 android 中通过反射使用 BatteryStatsImpl 内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10310521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com