Получение уровня заряда батареи - PullRequest
0 голосов
/ 04 января 2019

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

Я хочу получить текущий доступный заряд батареи в мАч для любого телефона 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();
    }
}

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

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

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 голосов
/ 04 января 2019

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

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