Как бы я обновлял состояние зарядки аккумулятора каждую секунду - PullRequest
0 голосов
/ 24 января 2019

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

  IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
  Context context = this;
  Intent batteryStatus = context.registerReceiver(null, ifilter);
  int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
  boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
  int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
  boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
  boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
  if (isCharging) {
    if (usbCharge) {
      tv1.setText("USB plugged in");
    } else {
      if (acCharge) {
        tv1.setText("AC plugged in");
      }
    }
  } else {
    tv1.setText("Connect your charger");
  }
}

Я поместил этот код в oncreate.Но проблема в том, что он показывает статус только один раз (при запуске приложения).Поэтому я поставил задачу таймера, чтобы повторить проверку следующим образом

t = new TimerTask() {
    @Override 
    public void run() {
        runOnUiThread(new Runnable() {
              @Override 
              public void run() {
                  IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
                  Context context = this;
                  Intent batteryStatus = context.registerReceiver(null, ifilter);
                  int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                  boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
                  int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
                  boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
                  boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
                  if (isCharging) {
                    if (usbCharge) {
                      tv1.setText("USB plugged in");
                    } else {
                      if (acCharge) {
                        tv1.setText("AC plugged in");
                      }
                    }

Но это не работает и выдает ошибку

Несоответствие типов: Невозможно выполнить преобразование из нового Runnable () {} в контекст

Я новичок, поэтому, пожалуйста, посмотрите, не могли бы вы помочь мне с некоторыми изменениями или даже с новым кодом.Заранее спасибо.Важное примечание: я работаю над Sketchware, который позволяет вам размещать коды только в MainActivity.xml или MainActivity.java, а другие функции, такие как manifest.xml, недоступны для редактирования.Пожалуйста, имейте это в виду при ответе.

1 Ответ

0 голосов
/ 24 января 2019

Используйте Broadcast Receiver для получения статуса батареи.Вот так: -

// Initialize a new BroadcastReceiver instance
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {            
        int status=intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1);            
        if(status==BatteryManager.BATTERY_STATUS_CHARGING)
        {
            //Do anything if Charging
        }
        else
        {
            //Do anything if not Charging
        }
    }
}

Назовите это так: -

// Get the application context
Context mContext = getApplicationContext();
// Initialize a new IntentFilter instance
IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
// Register the broadcast receiver
mContext.registerReceiver(mBroadcastReceiver,iFilter);

Надеюсь, это поможет вам !!!

...