public static BatteryStatus ToBatteryStatus(this Windows.System.Power.BatteryStatus status)
        {
            switch (status)
            {
            case Windows.System.Power.BatteryStatus.Discharging:
                return(BatteryStatus.Discharging);

            case Windows.System.Power.BatteryStatus.Idle:
                return(BatteryStatus.Idle);

            case Windows.System.Power.BatteryStatus.Charging:
                return(BatteryStatus.Charging);
            }

            return(BatteryStatus.NotPresent);
        }
示例#2
0
        internal BatteryReport()
        {
            //  battery values are current for object creation

            // using info from https://developer.android.com/training/monitoring-device-state/battery-monitoring
            var ifilter       = new Android.Content.IntentFilter(Android.Content.Intent.ActionBatteryChanged);
            var batteryStatus = Android.App.Application.Context.RegisterReceiver(null, ifilter);

            if (batteryStatus is null)
            {
                Status = UwpBatteryStatus.NotPresent;
                return;
            }

            // since API 5, so we don't have to check OS level
            if (!batteryStatus.GetBooleanExtra(Android.OS.BatteryManager.ExtraPresent, false))
            {
                Status = UwpBatteryStatus.NotPresent;
                return;
            }

            Status = UwpStatusFromAndroidStatus(batteryStatus.GetIntExtra(Android.OS.BatteryManager.ExtraStatus, -1));

            if (Android.OS.Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Lollipop)
            {
                // this probably doesn't happen, but anyway we can try to set some values...

                // since API 5
                int level = batteryStatus.GetIntExtra(Android.OS.BatteryManager.ExtraLevel, 1);
                int scale = batteryStatus.GetIntExtra(Android.OS.BatteryManager.ExtraScale, 100);

                // 100*RemainingCapacityInMilliwattHours / FullChargeCapacityInMilliwattHours gives percentage of remaining battery
                RemainingCapacityInMilliwattHours  = level;
                FullChargeCapacityInMilliwattHours = scale;

                return;
            }

            // now, we have API 21+, so we have more values

            // voltage is int, but in mV; we want to have voltage in Volts
            float voltage = batteryStatus.GetIntExtra(Android.OS.BatteryManager.ExtraVoltage, 0) / 1000;

            using var batteryManager = (Android.OS.BatteryManager?)Android.App.Application.Context.GetSystemService(Android.Content.Context.BatteryService);
            if (batteryManager is null)
            {
                Status = UwpBatteryStatus.NotPresent;
                return;
            }
            int currentMicroAmps        = batteryManager.GetIntProperty((int)Android.OS.BatteryProperty.CurrentNow);        // Instantaneous battery current in microamperes, as an integer.
            int chargeCounterMicroAmpHr = batteryManager.GetIntProperty((int)Android.OS.BatteryProperty.ChargeCounter);     // Battery capacity in microampere-hours, as an integer.
            // long energyCounterNanoWattHr = batteryManager.GetLongProperty((int)Android.OS.BatteryProperty.EnergyCounter); // Battery remaining energy in nanowatt-hours, as a long integer.
            int energyCounterNanoWattHr = batteryManager.GetIntProperty((int)Android.OS.BatteryProperty.EnergyCounter);     // But in reality, seems like it is int not long (doc has error here)

            // Android: Instantaneous battery current in microamperes, as an integer.
            // UWP: mW
            // both: > 0 charging, < 0 discharging
            // conversion: milli = 1000 micro; and watt = volt * amper
            ChargeRateInMilliwatts = (int)(voltage * currentMicroAmps / 1000);

            // Android: Battery remaining energy in nanowatt-hours, as a long integer.
            // UWP: mWh
            // conversion: milli = 1000 micro; and micro = 1000 nano
            RemainingCapacityInMilliwattHours = (int)(energyCounterNanoWattHr / (1000 * 1000));

            // Android: Battery capacity in microampere-hours, as an integer.
            // UWP: mWh
            // conversion: milli = 1000 micro; and watt = volt * amper
            FullChargeCapacityInMilliwattHours = (int)(voltage * chargeCounterMicroAmpHr / 1000);

            // UWP doc says: Some battery controllers might return the same value as FullChargeCapacityInMilliwattHours or return no value at all.
            DesignCapacityInMilliwattHours = FullChargeCapacityInMilliwattHours;
        }