Как определить, когда батарея разряжена: Android?

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

 <receiver android:name=".BatteryLevelReceiver" 
         <intent-filter>
            <action android:name="android.intent.action.ACTION_BATTERY_LOW" />
            <action android:name="android.intent.action.ACTION_BATTERY_OKAY" />
        </intent-filter>
 </receiver>

И следующий код в приемнике

public class BatteryLevelReceiver extends BroadcastReceiver 
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Toast.makeText(context, "BAttery dying!!", Toast.LENGTH_LONG).show();
        Log.e("", "BATTERY LOW!!");
    }
}

Я запускаю приложение на эмуляторе и меняю уровень заряда батареи с помощью telnet. Он меняет уровень заряда батареи, но не показывает тостов или журналов.

Что мне не хватает? Любая помощь приветствуется! Спасибо.

Ответ 1

Зарегистрируйте ваш ресивер в коде, а не в файле AndroidManifest.

registerReceiver(batteryChangeReceiver, new IntentFilter(
    Intent.ACTION_BATTERY_CHANGED)); // register in activity or service

public class BatteryChangeReceiver extends BroadcastReceiver {

    int scale = -1;
    int level = -1;
    int voltage = -1;
    int temp = -1;

    @Override
    public void onReceive(Context context, Intent intent) {
        level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
        voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
    }
}

unregisterReceiver(batteryChangeReceiver);//unregister in the activity or service

Или прослушивайте уровень заряда батареи с нулевым приемником.

Intent BATTERYintent = this.registerReceiver(null, new IntentFilter(
        Intent.ACTION_BATTERY_CHANGED));
int level = BATTERYintent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
Log.v(null, "LEVEL" + level);

Ответ 2

Вы можете зарегистрировать приемник в AndroidManifest.xml, однако убедитесь, что действие, на которое вы фильтруете,

android.intent.action.BATTERY_LOW

а не

android.intent.action.ACTION_BATTERY_LOW

(который вы использовали в своем коде).

Ответ 3

k3v является правильным.

В документации есть ошибка. В нем конкретно говорится, что нужно использовать "android.intent.action.ACTION_BATTERY_LOW". Но правильное действие в манифесте - "android.intent.action.BATTERY_LOW" См. Здесь: http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

(Не удалось проголосовать, ответить на k3v, не хватать стоп-кадров в стеке)...

ОБНОВЛЕНИЕ: теперь я могу и проголосовал за k3v: -)

Ответ 4

Возможно, эмулятор не отвечает на сообщения BATTERY_LOW и BATTERY_OKAY. Попробуйте на реальном Android-устройстве.