android - 获取电池电量

标签 android battery

我知道有很多这样的问题,但我需要一个具体的答案,无论是否可能。

我想获取任何 Android 手机当前可用的电池电量(以 mAh 为单位)。这对我的项目至关重要。我试过 BatteryManager。

batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);

它准确地提供了我需要的信息,但仅适用于某些设备。

我还尝试通过 Java 反射使用 PowerProfile。

public void getBatteryCapacity() {
    Object mPowerProfile_ = null;

    final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";

    try {
        mPowerProfile_ = Class.forName(POWER_PROFILE_CLASS)
                .getConstructor(Context.class).newInstance(this);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        double batteryCapacity = (Double) Class
                .forName(POWER_PROFILE_CLASS)
                .getMethod("getAveragePower", java.lang.String.class)
                .invoke(mPowerProfile_, "battery.capacity");
        Toast.makeText(OffloadeeActivity.this, batteryCapacity + " mAh",
                Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但它提供了电池的总容量。我需要的是当前剩余的电池电量。 是否有任何通用的方法可以为每台设备获取它?任何图书馆也可以。

最佳答案

这可以通过获取以毫安小时为单位的总电池容量,然后找到电池电量的百分比,最后将它们相乘以获得以毫安小时为单位的当前电池生命周期来实现。以下代码块是获取电池的总容量(以毫安小时为单位)的函数:

public double getBatteryCapacity(Context context) {
    Object mPowerProfile;
    double batteryCapacity = 0;
    final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";

    try {
        mPowerProfile = Class.forName(POWER_PROFILE_CLASS)
            .getConstructor(Context.class)
            .newInstance(context);

    batteryCapacity = (double) Class
            .forName(POWER_PROFILE_CLASS)
            .getMethod("getBatteryCapacity")
            .invoke(mPowerProfile);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return batteryCapacity;
}

现在您已经有了电池容量,您可以找到当前电池生命周期的百分比,然后将其乘以总容量以获得以毫安小时为单位的电量:

BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

如果您想以 float 的形式返回电池百分比水平(示例 89.92%),您可以使用以下代码:

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 batLevel = (float) level / (float) scale;

现在,您可以执行以下操作来获得毫安小时的电池生命周期:

int batteryInMilliamps = getBatteryCapacity(getApplicationContext()) * batLevel;

如果您收到任何问题或有任何疑问,请在下方发表评论。

关于android - 获取电池电量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54038290/

相关文章:

android - SetView AlertDialogBu​​ilder 奇怪的行为

android - 在Android编程中,我可以为一个Activity注册多个BroadcastReceiver吗?

android - android WebView 是否支持带有 download 属性的 <a> 标签?有什么解决方法吗?

android - 在 kitkat 4.4 中检查省电模式

macos - 如何确定 OSX 是否使用电池而非电源

android - 定时器、TimerTask 和电池消耗

android - 限制 android GPS 跟踪,但将数据收集限制在非常特定的地理区域以及手机处于运动状态时

java - Android opengl es 2.0 - 我应该使用什么模型格式以及我应该创建自己的解析器

android - 如何在 Android 上加载 MapView (MapBox) 时显示 ProgressDialog?

使用 ProGuard 构建的 Android 可以无限期地运行 AGP 3.2.0 或更高版本