Intereting Posts
Как выполнить HTTP-запросы через Wi-Fi непосредственно с Android Wear? Как добавить простой заголовок / нижний колонтитул 8dp в Android RecyclerView? Гиперссылка в Android Каков диапазон HOUR_OF_DAY? Google Cloud Messaging (GCM) не доставляет, когда устройство снова подключено к сети Определение пользовательского флажка в android Карты Google api v2 – Тип android.app.Fragment не может быть разрешен. Это косвенно ссылается на требуемые файлы .class Android / Java Javadoc отсутствует после обновления Android SDK GetQuantityString не заменяет формат значением Оптимизация 2 для Android: асинхронный запрос или синхронный запрос в AsyncTask? Плагин Android заменяет вид другим видом во время выполнения Скопировать изображение в буфер обмена в android Библиотека использует тот же пакет, что и этот проект после импорта Facebook SDK Eclipse «Недопустимое описание проекта» при создании нового проекта из существующего источника Android Реализация чата Bubble в ListView

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