Intereting Posts
CSS Media Query – Soft-клавиатура нарушает правила ориентации CSS – альтернативное решение? Проблема с утечкой базы данных Content Content Provider Акселерометр останавливает доставку образцов, когда экран выключен на Droid / Nexus One даже с WakeLock Возможно ли читать данные Firebase без подключения слушателей? Проблема Android Proguard – по-прежнему появляется сообщение об ошибке «java.io.IOException: Can not process class …» при обфускации Веб-просмотр android с сертификатом клиента Как нарисовать форму волны музыкального плеера Android? Изменение цвета строки состояния с помощью AppCompat ActionBarActivity Включить библиотеку Boost C ++ в android Использование GSON для разбора JSON с динамическим «ключом» и «значением» в android Как узнать, когда MediaRecorder закончил запись данных в файл Отправить текст для конкретного контакта (whatsapp) Как избежать отклонения разрешения EACCES на SDCARD с версией KITKAT 4.4.2. Новая политика из Google Android: QCMediaPlayer не может быть расположен Добавить марку выше элемента списка ListView (и ниже последнего) в Android

Получите уровень заряда аккумулятора, прежде чем радиовещательный приемник ответит на Intent.ACTION_BATTERY_CHANGED

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

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, который должен быть установлен на основе уровня заряда батареи, он должен дождаться события батареи. Есть ли способ подтолкнуть это, чтобы заставить его работать или просто запустить какой-то код, чтобы узнать, какой уровень заряда батареи был в последней трансляции?

Solutions Collecting From Web of "Получите уровень заряда аккумулятора, прежде чем радиовещательный приемник ответит на Intent.ACTION_BATTERY_CHANGED"

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

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

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

 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 не разрешено регистрироваться для получения намерений

  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) + "%"; } 
 // 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)); } 

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

 public float getMyBatteryLevel() { Intent batteryIntent = this.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); return batteryIntent.getIntExtra("level", -1); } 

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

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

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

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

Я просто получил исключение из null-указателя, в результате чего приложение вышло из строя!