Получить уровень заряда батареи, прежде чем приемник вещания ответит на Intent.ACTION_BATTERY_CHANGED - PullRequest
41 голосов
/ 07 сентября 2010

В моей программе есть широковещательный приемник, который реагирует на уровень заряда батареи следующим образом:

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent intent) {
        int level = intent.getIntExtra("level", 0);
        // do something...
    }
}

    registerReceiver(this.mBatInfoReceiver, 
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

Однако этот код должен ждать обновления состояния батареи, поэтому, если у вас есть элемент GUIэто должно быть установлено на основе уровня заряда батареи, он должен ждать, пока произойдет событие батареи.Есть ли способ подтолкнуть это, чтобы он заработал, или просто запустить какой-нибудь код, чтобы увидеть, какой уровень заряда батареи был в последней трансляции?

Ответы [ 6 ]

84 голосов
/ 29 октября 2010

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

Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
double scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
double level = -1;
if (rawlevel >= 0 && scale > 0) {
    level = rawlevel / scale;
}

Он может использовать нулевой BroadcastReceiver из-за липкой природы вещания.

Он использует трюк getApplicationContext (), если вы находитесь в получателе намерений и получаете исключение:

android.content.ReceiverCallNotAllowedException: Компоненты IntentReceiver не являются разрешено зарегистрироваться для получения * 1009 намерения *

37 голосов
/ 07 сентября 2010

Есть ли способ подтолкнуть это, чтобы заставить его работать или просто запустить какой-то код, чтобы увидеть, что уровень заряда батареи был включен последний эфир?

Вы можете позвонить registerReceiver() со своими IntentFilter и null BroadcastReceiver, чтобы получить последнюю трансляцию Intent. Это работает, потому что ACTION_BATTERY_CHANGED - это так называемая «липкая трансляция», которую я описываю немного больше в этом вопросе-ответе StackOverflow .

5 голосов
/ 12 мая 2014
    public static String batteryLevel(Context context)
    {
        Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));   
        int    level   = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int    scale   = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int    percent = (level*100)/scale;
        return String.valueOf(percent) + "%";
    }
2 голосов
/ 23 апреля 2013
// Put this Code into your MainActivity

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent i) {
        int level = i.getIntExtra("level", 0);
        ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
        pb.setProgress(level);
        TextView tv = (TextView) findViewById(R.id.textfield);
        tv.setText("Battery Level: " + Integer.toString(level) + "%");
    }

};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    registerReceiver(mBatInfoReceiver, new IntentFilter(
            Intent.ACTION_BATTERY_CHANGED));
}
1 голос
/ 04 февраля 2014

Я использую этот метод для получения уровня заряда батареи без получения обновлений.

public float getMyBatteryLevel() {
        Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        return batteryIntent.getIntExtra("level", -1);
}
0 голосов
/ 24 августа 2016

Пожалуйста, имейте в виду, что намерение, которое вы получаете от registerReceiver, вызывает

Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

может быть нулевым. Поэтому, пожалуйста, сделайте проверку перед использованием намерения, например,

if(intent != null){ 
// do your stuff here... 
}

Я только что получил исключение нулевого указателя, приводящее к сбою приложения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...