Search code examples
androidbroadcastreceiverbatteryrepeatingalarm

Android BatteryManager Returns only 1


I am attempting to read the state of the Android battery when my repeating alarm broadcaster is called I have the following setup:

public class RepeatingAlarm extends BroadcastReceiver {

    @Override       
    public void onReceive(Context context, Intent intent)
    {

            // Acquire the make of the device
            final String PhoneModel = android.os.Build.MODEL;
            final String AndroidVersion = android.os.Build.VERSION.RELEASE;

            // Grab the battery information
            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            final float batteryPct = level / (float)scale; 
    }

}

But I don't understand why it is returning that batteryPct = 1. Is there something I am missing here? I added the correct permissions based on the android Google page, but that doesn't seem to have helped.


Solution

  • You are getting -1 for both level and scale. That is because you might be trying to broadcast ACTION_BATTERY_CHANGED in the manifest.

    ACTION_BATTERY_CHANGED is a sticky intent and you cannot register a receiver to it in the manifest. Try the following

     Intent i = new ContextWrapper(applicationContext).registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
     // now you can get the level and scale from this intent variable
    int level = i.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = i.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
    
    float battPct = level/(float)scale;
    

    You would not neet to device a receiver for this intent, just use the above mentioned way, whereever you want to use it.