Получение уровня заряда батареи

1

Я знаю, что таких вопросов много, но мне нужен конкретный ответ, возможно это или нет.

Я хочу получить текущий доступный заряд батареи в мАч для любого телефона Android. Это важно для моего проекта. Я попробовал BatteryManager.

batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);

Это именно та информация, которая мне нужна, но только для некоторых устройств.

Я также пытался использовать PowerProfile через Java Reflection.

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();
    }
}

Но это обеспечивает общую емкость батареи. Что мне нужно, это текущий оставшийся заряд батареи. Есть ли универсальный способ получить это для каждого устройства? Любая библиотека тоже подойдет.

Теги:
battery

2 ответа

0

Это может быть достигнуто путем получения полной емкости батареи в миллиампер-часах, затем определения процента уровня заряда батареи и, наконец, умножения их вместе, чтобы получить текущее время автономной работы в миллиамперах часов. Следующий блок кода является функцией для получения полной емкости батареи в миллиамперах часов:

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);

Если вы хотите вернуть процент заряда батареи в виде числа с плавающей запятой (пример 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;

Если вы получили какие-либо вопросы или у вас есть какие-либо вопросы, просто прокомментируйте ниже.

  • 0
    Ваш метод правильный. Но мне нужен более точный уровень заряда батареи, так как я хочу рассчитать уровень заряда батареи до и после некоторых конкретных задач. Так как BATTERY_PROPERTY_CAPACITY возвращает процент батареи в виде целого числа (без дробной части), было бы очень трудно определить разницу. Некоторые задачи занимают всего около 20-50 мАч.
  • 0
    Итак, что вы хотите, чтобы уровень заряда батареи возвращался как двойной? Нравится 89,982%? Емкость батареи в миллиампер-часах уже возвращается в два раза. Это процентный уровень, который вы хотите удвоить?
Показать ещё 4 комментария
0

Попробуйте это, это поможет вам

public static int getBatteryPercentage(Context context) {

    IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = context.registerReceiver(null, iFilter);

    int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
    int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;

    float batteryPct = level / (float) scale;

    return (int) (batteryPct * 100);
}
  • 0
    Это возвращает процент батареи. Что я хочу, так это оставшийся заряд батареи в мАч.
  • 0
    проверить этот ответ stackoverflow.com/a/46736648/2337837
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню