Android: сделайте что-нибудь, когда батарея находится на определенном уровне

Я застрял здесь с небольшой проблемой.

Я хочу, чтобы мое приложение что-то делало, но только когда батарея разряжена до 10%.

Мое приложение не следит за уровнем заряда батареи постоянно; он просто ждет намерения LOW_BATTERY.

Это работает, если я не указываю уровень, но работает 3 раза: 15%, 10% и 5%

Я только хочу, чтобы он делал что-то на 10%.

Вот мой код:

public void onReceive(Context context, Intent intent) 
{
    if(intent.getAction().equals(ACTION_BATTERY_LOW))
    {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int percent = (level*100)/scale; 

        if(percent == 10)
        {
            // Do Something

        }
    }
}

person FrenchDude    schedule 24.04.2012    source источник
comment
Я никогда не работал с уровнем заряда батареи, но почему бы не принять три уведомления, проверить уровень заряда батареи в каждом уведомлении и действовать только тогда, когда он составляет 10%?   -  person Sam    schedule 25.04.2012
comment
В дополнение к комментарию Сэма, имейте в виду, что нет никакой гарантии, что вы когда-либо получите трансляцию ровно за 10%. Конкретное устройство может легко транслировать на 11%, а затем снова на 9%.   -  person CommonsWare    schedule 25.04.2012
comment
Сэму: Эй, это именно то, чем я занимаюсь! Я получаю уведомление о низком заряде батареи, а затем проверяю, 10% ли это, затем я что-то делаю. Но это никогда не работает. Может быть, как предложил CommonsWare, я должен попытаться также принять 9 и 11%. Я вам скажу ! Спасибо ! ;)   -  person FrenchDude    schedule 25.04.2012
comment
Это не работает ! Я даже пробовал, если (проценты>8 && процентов‹12). Кто-нибудь может мне помочь ?   -  person FrenchDude    schedule 25.04.2012
comment
Просто проверьте, какой процент вы ДЕЙСТВИТЕЛЬНО получаете, а не просто не делайте этого. Если вы плохо извлекаете процент и получаете странные числа, то это ваша проблема. Если вас ткнули только на 7,8%, вот и все. Просто отлаживать и куда-то писать проценты? Затем, если вы действительно запустили свое событие, убедитесь, что вы установили какой-то флаг, чтобы оно не повторялось дважды?   -  person Nanne    schedule 06.06.2012


Ответы (2)


ACTION_BATTERY_LOW не содержит дополнений, которые вы пытаетесь прочитать, поэтому каждый раз вы получаете percent как -1.

Как намекнул @bimal, эти дополнения прикреплены к трансляции ACTION_BATTERY_CHANGED. Это не означает, однако, что вы должны просто зарегистрироваться, чтобы получить это вместо этого. ACTION_BATTERY_CHANGED является липким, поэтому registerReceiver() немедленно возвращает последнее намерение. Это означает, что вы можете сделать что-то вроде:

public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals(ACTION_BATTERY_LOW)) {
        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, 100);
        int percent = (level*100)/scale; 

        if (percent <= 10 && percent > 5) {
            // Do Something
        }
    }
}

Обратите внимание, что registerReciever() был вызван с null BroadcastReceiver, поэтому вам не нужно беспокоиться об отмене регистрации. Это хороший, чистый способ просто сказать: «Какой сейчас уровень заряда батареи?» (Ну, технически это то, что было в прошлый раз, когда была отправлена ​​широковещательная рассылка.)

person Darshan Rivka Whittle    schedule 06.07.2012
comment
Спасибо за это. Но теперь, как я могу убедиться, что я выполняю что-то только один раз, и только один раз, пока в следующий раз он не упадет? - person FrenchDude; 06.07.2012
comment
@user1352526 user1352526 Это другой вопрос, но достаточно простой: ACTION_BATTERY_OKAY специально предназначен для того, чтобы сообщить вам, когда батарея больше не разряжена. Итак, 1) зарегистрируйтесь и для этого вещания, 2) установите флаг, указывающий, что это низкое состояние было обработано, когда вы делаете что-то в ответ на состояние LOW, 3) когда вы получаете LOW Broadcast, игнорируйте его, если оно уже было обрабатывается, и 4) снимите этот флаг, когда вы получите OKAY Broadcast. - person Darshan Rivka Whittle; 07.07.2012
comment
Большое спасибо, я позабочусь об этом. Это может быть полезно - person FrenchDude; 07.07.2012
comment
Но мне интересно... Какую трансляцию я должен ожидать в вашем onReceive? - person FrenchDude; 11.07.2012
comment
@user1352526 user1352526 Вы можете зарегистрироваться, чтобы получать как ACTION_BATTERY_LOW, так и ACTION_BATTERY_OKAY с одним и тем же; для этого и нужен if(intent.getAction().equals(ACTION_BATTERY_LOW)), чтобы вы могли определить, какую трансляцию вы только что получили, и ответить соответствующим образом. Вы, вероятно, хотите else if(intent.getAction().equals(ACTION_BATTERY_OKAY)) ниже этого, если логика для OKAY Broadcast идет. - person Darshan Rivka Whittle; 11.07.2012

В этом случае вы можете использовать «ACTION_BATTERY_CHANGED».

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
            int level = intent.getIntExtra("level", 0);
            int scale = intent.getIntExtra("scale", 100);
            double batStatus = level * 100 / scale;
        }
    }

Надеюсь, что это поможет вам.

person bimal    schedule 06.06.2012