Broadcast receiver - monitoring the Battery Level and Charging State

前端 未结 7 2184
逝去的感伤
逝去的感伤 2020-12-31 23:40

I am trying to make two toasts: one when the device is charging, and one when it`s not. But the receiver acting crazy, sending many toasts, and crashing the app. I can not f

7条回答
  •  不知归路
    2021-01-01 00:02

      private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent intent) {
          // TODO Auto-generated method stub
            //this will give you battery current status
    
        try{
          int level = intent.getIntExtra("level", 0);
          int temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
          int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
          int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
    
          String BStatus = "No Data";
          if (status == BatteryManager.BATTERY_STATUS_CHARGING){BStatus = "Charging";}
          if (status == BatteryManager.BATTERY_STATUS_DISCHARGING){BStatus = "Discharging";}
          if (status == BatteryManager.BATTERY_STATUS_FULL){BStatus = "Full";}
          if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING){BStatus = "Not Charging";}
          if (status == BatteryManager.BATTERY_STATUS_UNKNOWN){BStatus = "Unknown";}
    
          int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
          String BattPowerSource = "No Data";
          if (chargePlug == BatteryManager.BATTERY_PLUGGED_AC){BattPowerSource = "AC";}
          if (chargePlug == BatteryManager.BATTERY_PLUGGED_USB){BattPowerSource = "USB";}
    
          String BattLevel = String.valueOf(level);
    
          int BHealth = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, -1);
          String BatteryHealth = "No Data";
          if (BHealth == BatteryManager.BATTERY_HEALTH_COLD){BatteryHealth = "Cold";}
          if (BHealth == BatteryManager.BATTERY_HEALTH_DEAD){BatteryHealth = "Dead";}
          if (BHealth == BatteryManager.BATTERY_HEALTH_GOOD){BatteryHealth = "Good";}
          if (BHealth == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE){BatteryHealth = "Over-Voltage";}
          if (BHealth == BatteryManager.BATTERY_HEALTH_OVERHEAT){BatteryHealth = "Overheat";}
          if (BHealth == BatteryManager.BATTERY_HEALTH_UNKNOWN){BatteryHealth = "Unknown";}
          if (BHealth == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE){BatteryHealth = "Unspecified Failure";}
    
          //Do whatever with the data here
    
    
        } catch (Exception e){
            Log.v(TAG, "Battery Info Error");
        }
        }
      };
    

    You MUST register it dynamically.

    Doing so in a service would probably be a good bet. This is what I've used:

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

提交回复
热议问题