Wednesday, January 19, 2011

Измерение заряда батареи

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

Для этой магии существует простое заклинание. В той Activity, где будет происходить длительный процесс, который лучше не прерывать, вставляем проверку:

private int checkBatteryLow(){
        BroadcastReceiver wIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // Получаем сообщение от девайса
                String wAction = intent.getAction();
                if(wAction.equals(Intent.ACTION_BATTERY_CHANGED))
                {
                    // Здесь можно информировать пользователя об изменении
                    // заряда батареи
                }
                else if(wAction.equals(Intent.ACTION_BATTERY_LOW))
                {
                    // Здесь можно информаровать пользователя о низком
                    // заряде батареи
                }
            }
        };

        // Создаем фильтры
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_LOW);

        // Подключаем получателя сообщений от девайса с установленными фильтрами
        Intent intent = this.registerReceiver(wIntentReceiver, filter);
        
        // Получем значение "level" из данных о заряде батареи
        Object l = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        Object s = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        int level = (Integer)l;
        int scale = (Integer)s;
        
        if (level >= 0 && scale > 0) {
            level = (level * 100) / scale;
        }
        
        // Отключаем получателя
        unregisterReceiver(wIntentReceiver);
        return level;
    }


После этого в нужном месте вызываем проверку и получаем из нее число, показывающее текущий заряд батареи (от 0 до 100). Это значение проверяем с надуманным пороговым значением и по езультатам проверки принимаем решение, запускать ли длительный процесс в приложении или заставить пользователя зарядить девайс.