Android电池pipe理器的替代品

我正在尝试在我的应用程序中获取电池统计信息以进行一些基准testing。 美妙的BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER让我查询设备的微型放大器是伟大的。 但是,这只是在API 21中引入的,所以这个设备的数量是非常有限的。 是否有一种兼容的方式来在较低版本的API(低到4.0)做类似的事情? 我知道BatteryManager.EXTRA_LEVEL会给我的百分比,但这不是很好。

Solutions Collecting From Web of "Android电池pipe理器的替代品"

据我所知,你不能用较老的公共API来做到这一点。 我曾在一个系统级别的应用程序,向用户显示电池使用情况统计。 我基于Android设置应用程序的代码,我的用户可能需要root访问权限,或者应用程序必须使用平台密钥进行签名。 您可以查看PowerUsageDetail , BatteryInfo和PowerUsageSummary类。 如果幸运的话,您可能会通过JAVAreflection访问隐藏的API。 否则,您需要平台密钥或根。 内部的API变化很频繁,所以使用起来相当麻烦。

还有一些你可能想要查看的工具:

  • adbshell转储电池
  • adbshell转储batteryinfo
  • 电池历史学家
  • 亚行壳bugreport

Dumpsys源代码

祝你好运!

编辑:

我的旧项目可能对你有用。

今年早些时候,我遇到了一篇有趣的文章,介绍了一种仅基于设备功耗(称为PowerSpy)来定位智能手机的方法。

虽然我从来没有实施/testing过自己的方法,作者声称:

在Android上阅读手机的聚合功率计是通过反复阅读以下两个文件完成的:
/sys/class/power_supply/battery/voltage_now
/sys/class/power_supply/battery/current_now

他们还声称已经testing了Nexus 4,Nexus 5和HTC的方法。 虽然这并不是特定于Android设备所搭载的Android版本的具体情况,但是Nexus 4应该具有API级别17和Nexus 5 API级别19,但是这两款手机似乎都需要进行操作系统升级。

但是,与其他海报提及的方法相比,这似乎是一个截然不同的方法,所以可能值得一提。 不幸的是,这似乎是一个低级的方法,所以需要做很多工作来获得你所需要的东西,因为像物理学这样的能量并不意味着电池的消耗。 但也许你需要这样的方式。

最后,文章提到,访问这两个文件不需要特别的权限(这首先是研究的动机)。

编辑

第二个想法是,如果你绘制P=U*I (如上所述获得U和I)并随着时间积分(这将是这个离散情况下的总和),那么你可能会得到一个非常好的电池消耗的近似值。 也许你还要考虑一个卡尔曼滤波器(为了减弱U和I上的噪声,记住你的algorithm不是唯一的消费者),你可能只是得到你想要的。

根据电池监测培训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; 

请注意,您需要重复调​​用此function以获取更新的电池电量。 当唤醒你的应用程序,并检查这确实需要电池本身,他们build议: