Android BatteryManager 备选方案

Android BatteryManager Alternatives

我正在尝试在我的应用程序中获取电池统计数据以进行一些基准测试。很棒的 BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER 让我查询设备的微放大器,这很棒。然而,这只是在 API 21 中引入的,因此它可以达到的设备数量非常有限。在较低版本的 APIs(低至 4.0)中是否有兼容的方法来做类似的事情?我知道 BatteryManager.EXTRA_LEVEL 会给我百分比,但这确实不够精细。

据我所知,旧的 public API 无法做到这一点。我开发了一个系统级应用程序,可以向用户显示电池使用情况统计信息。我的代码基于 Android 设置应用程序,我的用户可能需要 root 访问权限,或者应用程序必须使用平台密钥进行签名。您可以查看 PowerUsageDetail, BatteryInfo, and PowerUsageSummary 类。如果幸运的话,您可能会通过 JAVA 反射访问隐藏的 API。否则,您需要平台密钥或根。内部 API 经常更改,因此使用起来非常痛苦。

您可能还想查看一些工具:

  • adb shell dumpsys batterystats
  • adb shell dumpsys 电池信息
  • battery historian
  • adb shell 错误报告

Dumpsys source code

祝你好运!

编辑:

My old project might be useful for you.

根据电池监控培训http://developer.android.com/training/monitoring-device-state/battery-monitoring.html,您可以通过以下方式获取当前电池信息:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;

请注意,您需要继续重复调用此函数以获取更新的电池电量。当唤醒您的应用程序并检查它本身是否会耗电时,他们建议:

今年早些时候,我 运行 阅读了一篇有趣的文章,该文章介绍了一种仅根据设备功耗定位智能手机的方法,名为 PowerSpy

虽然我自己从未 implemented/tested 使用该方法,但作者声称:

On Android reading the phone’s aggregate power meter is done by repeatedly reading the following two files:
/sys/class/power_supply/battery/voltage_now
/sys/class/power_supply/battery/current_now.

他们还声称已经在 Nexus 4、Nexus 5 和 HTC 上测试了该方法。虽然这并不具体说明设备配备了 Android 的确切版本,但 Nexus 4 应该配备 API 级别 17,Nexus 5 应该配备 API 级别 19,但两者手机似乎需要 OS 升级。

然而,与其他发帖者提到的方法相比,这似乎是一种截然不同的方法,所以可能值得一提。不幸的是,这似乎是一种低级方法,因此可能需要做很多工作才能获得所需的东西,因为在物理学中,功率并不真正意味着电池消耗。但也许你需要这样。

最后,文章提到访问这两个文件不需要特殊权限(这是他们最初进行研究的动机)。

编辑

再想一想,如果您绘制 P=U*I(如上所述得到 U 和 I)并随时间积分(在这种离散情况下,这将是一个总和),您可能会得到一个非常好的电池近似值消耗。也许您还考虑了卡尔曼滤波器(以衰减 U 和 I 上的噪声,请记住您的算法不是唯一的消费者)并且您可能会得到您想要的。