Получите уровень заряда батареи только один раз, используя Android SDK

Я искал в Интернете и не мог найти ответ на свой вопрос. Моя проблема заключается в том, чтобы получить информацию об уровне заряда батареи только один раз, например. вызов функции getBatteryLevel(). Есть только решения, которые реализованы с использованием BroadcastReceiver, но, насколько я знаю, он будет вызываться каждый раз при событии изменения уровня заряда батареи. Подскажите пожалуйста, как я могу получить эту информацию только один раз?


person Karlen Kishmiryan    schedule 01.04.2013    source источник
comment
Используйте BroadcastReceiver, а затем, как только вы получите значение, просто отмените регистрацию получателя.   -  person TronicZomB    schedule 01.04.2013


Ответы (1)


Широковещательная рассылка Intent.ACTION_BATTERY_CHANGED – это так называемая "закрепленная рассылка". Поскольку это липкое, вы можете зарегистрироваться для трансляции с нулевым приемником, который получит уровень заряда батареи только один раз при вызове registerReceiver.

Функция для получения уровня заряда батареи без получения обновлений будет выглядеть примерно так:

public float getBatteryLevel() {
    Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

    // Error checking that probably isn't needed but I added just in case.
    if(level == -1 || scale == -1) {
        return 50.0f;
    }

    return ((float)level / (float)scale) * 100.0f; 
}

Из этой липкой трансляции можно извлечь больше данных. Используя возвращенный batteryIntent, вы можете получить доступ к другим дополнительным функциям, как указано в классе BatteryManager. .

person Michael Celey    schedule 01.04.2013
comment
Этот метод теперь нельзя вызывать из приемника (например, виджета). Знаете ли вы какой-либо другой способ получить уровень заряда батареи, который можно сделать из метода onUpdate() виджета? - person Andrew Mackenzie; 30.07.2013
comment
Если вы делаете это из виджета, вам нужно вызвать registerReceiver следующим образом: getApplicationContext().registerReciever(...) чтобы он заработал. - person Michael Celey; 30.07.2013
comment
У меня есть контекст, и я могу его вызвать, но вызов не разрешен из приемника, передав this или null в качестве первого параметра приемника. Сообщение журнала очень явное, что вы не можете вызывать из приемника. - person Andrew Mackenzie; 01.08.2013
comment
Вы не можете использовать любой контекст, вам нужно использовать контекст, возвращенный из getApplicationContext(), чтобы вызвать registerReceiver() из другого получателя. Я пробовал это, и это работает. Это также ответ, данный в этом вопросе, который очень похож на тот, который вы задаете: stackoverflow.com/questions/3691579/ - person Michael Celey; 01.08.2013
comment
С ApplicationContext это сработало отлично! Спасибо! - person Andrew Mackenzie; 07.08.2013
comment
Для этого требуется специальное разрешение? - person Sid; 08.07.2016
comment
Согласно документации Android, разрешения не требуются. - person Michael Celey; 08.07.2016
comment
Это единственный способ одноразового запроса состояния питания при запуске. Использование произвольного нового намерения в этом случае не сработает. Но последующее горячее подключение/отключение питания может быть обнаружено широковещательным событием. - person kakyo; 26.12.2019