Android BatteryManager возвращает 0 для всех вызовов по поиску свойств

У меня возникают проблемы с доступом к большинству статистических данных от батареи моего устройства Android, таких как BATTERY_PROPERTY_CAPACITY, BATTERY_PROPERTY_CHARGE_COUNTER или BATTERY_PROPERTY_CURRENT_AVERAGE. Все эти свойства четко задокументированы здесь: http://developer.android.com/reference/android/os/BatteryManager.html

У меня есть следующее разрешение, объявленное в моем манифесте:

<uses-permission android:name="android.permission.BATTERY_STATS" />

У меня есть ненулевой экземпляр BatteryManager:

mBatteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);

И всякий раз, когда я пытаюсь получить эту статистику:

double remainingCapacity = mBatteryManager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CAPACITY);
double batteryCapacityMicroAh = mBatteryManager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);
double averageCurrentMicroA = mBatteryManager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE);

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

Буду очень признателен за любую помощь. В конечном счете, я пытаюсь рассчитать время, оставшееся до полной зарядки устройства (во время зарядки). Заранее спасибо.


person Sergio Morales    schedule 28.08.2015    source источник


Ответы (3)


Не уверен, что это поможет вам сейчас, но только телефоны с датчиком уровня заряда батареи (https://source.android.com/devices/tech/power/device.html) может сообщить о некоторых значениях, которые вы ищете. Насколько я знаю, только Nexus 6, 9 и 10 дают все три значения, которые вы ищете, а Nexus 5 дает только BATTERY_PROPERTY_CAPACITY.

person Pablo Baxter    schedule 29.10.2015

Вам необходимо зарегистрироваться для трансляции Action_Battery_Changed. Это будет вызываться всякий раз, когда это событие происходит. Поскольку это липкое намерение, оно продолжает вещание после регистрации. Метод ниже позволит получить текущий уровень заряда батареи.

private void getBatteryPercentage() {
    BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            context.unregisterReceiver(this);
            int currentLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            int level = -1;
            if (currentLevel >= 0 && scale > 0) {
                level = (currentLevel * 100) / scale;
            }
            Toast.makeText(MainActivity.this, level + "%", Toast.LENGTH_LONG).show();
        }
    };
    IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}
person Mohammad    schedule 28.08.2015
comment
Ни одно из этих свойств не является тем, что мне нужно. Пожалуйста, перечитайте вопрос. Мне нужны свойства BATTERY_PROPERTY_CAPACITY и другие, которые НЕ предоставляются через намерение ACTION_BATTERY_CHANGED. - person Sergio Morales; 29.08.2015

Значение BatteryManager.EXTRA_LEVEL — это текущая емкость аккумулятора. Я предполагаю, что вы ищете общую емкость (полную), вам нужно прочитать /sys/class/power_supply/battery/charge_full_design или charge_full, у разных производителей может быть другой путь.

person e13386    schedule 07.01.2016