java - 在 Android 上获取准确的电池电量

标签 java android battery batterylevel

因此,我目前在我的 Android 应用程序中实现了以下常用方法来获取当前电池电量。

int getBatteryPercent(){
    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = this.registerReceiver(null, ifilter);
    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    return level;
}

问题是它返回一个 0-100 之间的整数。为了确保我的算法之一的准确性,我需要能够更精确地测量电池电量。我见过一些电池管理应用程序显示了可以完美工作的 mV。如果有人知道如何获得这个值,我们将不胜感激。

澄清一下:我需要当前的电池电量,而不是电池的总容量。

谢谢!

------------------------更新---------------------- -----

我现在使用以下代码:

    // Method for getting the current battery percentage
int getBatteryPercent(){
    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = this.registerReceiver(null, ifilter);
    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    return level;
}

// Method for getting the total battery capacity
double getBatteryCapacity() {
    double battCapacity = 0.0d;
    Object mPowerProfile_ = null;

    Log.d("Debug", "in getBatteryCapacity()");

    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();
        Log.d("Debug", "Try 1 - Exception e: " + e.toString());
    }

    try {
        battCapacity = (Double) Class
                .forName(POWER_PROFILE_CLASS)
                .getMethod("getAveragePower", java.lang.String.class)
                .invoke(mPowerProfile_, "battery.capacity");
        Log.d("Debug", "battCapacity is now: " + battCapacity);
    } catch (Exception e) {
        e.printStackTrace();
        Log.d("Debug", "Try 2 - Exception e: " + e.toString());
    }

    Log.d("Debug", "Leaving getBatteryCapacity()");
    return battCapacity;
}

// Method for getting the exact current battery level
double getExactBattery(){
    Log.d("Debug", "In getExactBattery()");
    float batteryPercentage = getBatteryPercent();
    Log.d("Debug", "batteryPercentage = " + batteryPercentage);
    double totalCapacity = getBatteryCapacity();
    Log.d("Debug", "totalCapacity = " + totalCapacity);
    double currLevel = (totalCapacity * (double)batteryPercentage) / 100.0d;
    Log.d("Debug", "currLevel = " + currLevel);
    return currLevel;
}

但是 getBatteryCapacity 方法给了我 0.0 返回值:

01-20 06:37:27.314    7162-7162/com... D/Debug﹕ In getExactBattery()
01-20 06:37:27.324    7162-7162/com... D/Debug﹕ batteryPercentage = 47.0
01-20 06:37:27.329    7162-7162/com... D/Debug﹕ in getBatteryCapacity()
01-20 06:46:00.644    9207-9207/com... D/Debug﹕ battCapacity is now: 0.0
01-20 06:37:27.329    7162-7162/com... D/Debug﹕ Leaving getBatteryCapacity()
01-20 06:37:27.329    7162-7162/com... D/Debug﹕ totalCapacity = 0.0
01-20 06:37:27.329    7162-7162/com... D/Debug﹕ currLevel = 0.0
<小时/>

我有一个在 Android 4.4.4 上运行的 Droid Ultra,此代码不起作用,它返回 0.0,但是当在具有多个 Android 版本的模拟器上运行时,它实际上可以工作。我很想知道在 Droid Ultra 上测试的其他用户是否也有同样的问题。上面的代码应该适用于大多数设备。

这实际上不是确切的电池电量。使用此算法,如果电池百分比为 97%,总容量为 1000,则准确的电池电量将显示为 970。现在,如果实际电池百分比为 96.7%,我的 getBatteryPercent 将返回 97。这将得到相同的确切答案。所以这个算法不是这个问题的答案。我还在寻找这个问题的答案!!!我需要比 +-1% 更精确的电池电量测量...

------------------------更新---------------------- -----

我发现如果您在广播接收器中使用 getIntExtra("Voltage", -1) 监听 ACTION_BATTERY_CHANGED。它为您提供 mV。我想知道这个值是否足够可靠,可以用于电池生命周期预测。有谁知道我可以在任何时间点获取电压而不依赖广播接收器的最新更新的方法吗?

编辑:事实证明它不可行。 this graph表明电池电压是电池容量的一个非常差的指标。

最佳答案

根据@user87049的链接获取电池容量,并使用您自己的函数获取当前电池百分比,并将这两者结合起来得到当前容量。

int batteryPercentage = getBatteryPercentage() //Your function
double batteryCapacity = getBatteryCapacity() //code from link from user87049. Change it to return value
double currentCapacity = (batteryPercentage * batteryCapacity) / 100

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

相关文章:

java - 有人能给我解释一下这段代码吗?关于用户输入、扫描仪等

android - 是否可以从单独的 jar 中的可绘制对象中设置 android 图标?

android - StackOverflowError,我不知道为什么

java - 如何在JOOQ中延迟获取组?

java - 是否有为 Java EE 容器定义 JDBC 数据源的标准方法?

安卓穿戴: Get phone battery level for display in watch face

android - 电池圈像 Battery Widget Reborn

android - 尝试获取电池电量时出现安全异常

java - build.gradle 中的复制任务不会将编译依赖项放在一个目录中,而将 testCompile 依赖项放在另一个目录中

java - 使用 json 将 Android 连接到 ASP.NET MVC