Win10/UWP新特性系列—电池报告

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间。

通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息。

通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电、容量和状态。

需要用到的资源:

  • Battery:提供该设备的电池控制器信息类
  • Battery.AggregateBattery:提供一个Battery的实例
  • ReportUpdated:当电池控制器报告更新时的事件
  • Battery. GetReport():获取电池报告对象BatteryReport
  • BatteryReport:电池报告对象
  • BatteryReport.Status:获取当前电池状态
  • BatteryReport.ChargeRateInMilliwatts:充电速度
  • BatteryReport.DesignCapacityInMilliwattHours:理论容量
  • BatteryReport.FullChargeCapacityInMilliwattHours:冲满后的容量,总容量
  • BatteryReport.RemainingCapacityInMilliwattHours:当前电量

下面写个Demo,来获取电池信息,以及处理电量低的时候的主题切换,(这里用充电中和没充电的状态来切换)

前台:?

 1 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
 2     <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
 3         <StackPanel VerticalAlignment="Center" Margin="6">
 4             <RadioButton x:Name="AggregateButton" Content="Aggregate results"
 5                          GroupName="Type" IsChecked="True"/>
 6             <RadioButton x:Name="IndividualButton" Content="Individual results"
 7                          GroupName="Type" IsChecked="False"/>
 8         </StackPanel>
 9         <StackPanel Orientation="Horizontal">
10             <Button x:Name="GetBatteryReportButton"
11                     Content="Get Battery Report"
12                     Margin="15,15,0,0" Click="GetBatteryReportButton_Click"
13                     />
14         </StackPanel>
15         <StackPanel x:Name="BatteryReportPanel" Margin="15,15,0,0"/>
16     </StackPanel>
17 </Grid>

后台:

  1 public sealed partial class MainPage : Page
  2  {
  3      bool reportRequested;
  4      public MainPage()
  5      {
  6          this.InitializeComponent();
  7          //订阅电池状态更改事件
  8          Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
  9      }
 10
 11      private async void AggregateBattery_ReportUpdated(Battery sender, object args)
 12      {
 13          if (reportRequested)
 14          {
 15              await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
 16              {
 17                  //清空显示区UI元素
 18                  BatteryReportPanel.Children.Clear();
 19
 20                  if (AggregateButton.IsChecked == true)
 21                  {
 22                      //多电池报告
 23                      RequestAggregateBatteryReport();
 24                  }
 25                  else
 26                  {
 27                      //单电池报告
 28                      RequestIndividualBatteryReports();
 29                  }
 30              });
 31          }
 32      }
 33
 34      /// <summary>
 35      /// 获取 单个电池 报告
 36      /// </summary>
 37      private void RequestIndividualBatteryReports()
 38      {
 39          var aggBattery = Battery.AggregateBattery;
 40
 41          var report = aggBattery.GetReport();
 42
 43          AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
 44      }
 45
 46      private void AddReportUI(StackPanel batteryReportPanel, BatteryReport report, string deviceId)
 47      {
 48          // 创建 电池报告 UI
 49          var txt1 = new TextBlock { Text = "设备 ID: " + deviceId };
 50          txt1.FontSize = 15;
 51          txt1.Margin = new Thickness(0, 15, 0, 0);
 52          txt1.TextWrapping = TextWrapping.WrapWholeWords;
 53
 54          var txt2 = new TextBlock { Text = "电池状态: " + report.Status.ToString() };
 55          ChangRequestedTheme(report.Status);
 56          txt2.FontStyle = Windows.UI.Text.FontStyle.Italic;
 57          txt2.Margin = new Thickness(0, 0, 0, 15);
 58
 59          var txt3 = new TextBlock { Text = "充电速度 (mW): " + report.ChargeRateInMilliwatts.ToString() };
 60          var txt4 = new TextBlock { Text = "理论产能 (mWh): " + report.DesignCapacityInMilliwattHours.ToString() };
 61          var txt5 = new TextBlock { Text = "总容量 (mWh): " + report.FullChargeCapacityInMilliwattHours.ToString() };
 62          var txt6 = new TextBlock { Text = "当前容量 (mWh): " + report.RemainingCapacityInMilliwattHours.ToString() };
 63
 64          // 创建电量比例UI
 65          var pbLabel = new TextBlock { Text = "剩余电量百分比" };
 66          pbLabel.Margin = new Thickness(0, 10, 0, 5);
 67          pbLabel.FontFamily = new FontFamily("Segoe UI");
 68          pbLabel.FontSize = 11;
 69
 70          var pb = new ProgressBar();
 71          pb.Margin = new Thickness(0, 5, 0, 0);
 72          pb.Width = 200;
 73          pb.Height = 10;
 74          pb.IsIndeterminate = false;
 75          pb.HorizontalAlignment = HorizontalAlignment.Left;
 76
 77          var pbPercent = new TextBlock();
 78          pbPercent.Margin = new Thickness(0, 5, 0, 10);
 79          pbPercent.FontFamily = new FontFamily("Segoe UI");
 80          pbLabel.FontSize = 11;
 81
 82          // 防止分母为0
 83          if ((report.FullChargeCapacityInMilliwattHours == null) ||
 84              (report.RemainingCapacityInMilliwattHours == null))
 85          {
 86              pb.IsEnabled = false;
 87              pbPercent.Text = "N/A";
 88          }
 89          else
 90          {
 91              pb.IsEnabled = true;
 92              pb.Maximum = Convert.ToDouble(report.FullChargeCapacityInMilliwattHours);
 93              pb.Value = Convert.ToDouble(report.RemainingCapacityInMilliwattHours);
 94              pbPercent.Text = ((pb.Value / pb.Maximum) * 100).ToString("F2") + "%";
 95          }
 96
 97          // 添加页面元素
 98          BatteryReportPanel.Children.Add(txt1);
 99          BatteryReportPanel.Children.Add(txt2);
100          BatteryReportPanel.Children.Add(txt3);
101          BatteryReportPanel.Children.Add(txt4);
102          BatteryReportPanel.Children.Add(txt5);
103          BatteryReportPanel.Children.Add(txt6);
104          BatteryReportPanel.Children.Add(pbLabel);
105          BatteryReportPanel.Children.Add(pb);
106          BatteryReportPanel.Children.Add(pbPercent);
107      }
108
109      /// <summary>
110      /// 根据电池使用状态改变Theme色
111      /// </summary>
112      /// <param name="status"></param>
113      private void ChangRequestedTheme(BatteryStatus status)
114      {
115          switch (status)
116          {
117              case BatteryStatus.NotPresent:
118                  Debug.WriteLine(BatteryStatus.NotPresent.ToString());
119                  break;
120              case BatteryStatus.Discharging:
121                  //电池处于放电状态
122                  Debug.WriteLine(BatteryStatus.Discharging.ToString());
123                  //当电量百分比很低是可以采用 黑色主题
124                  this.RequestedTheme = ElementTheme.Dark;
125                  break;
126              case BatteryStatus.Idle:
127                  Debug.WriteLine(BatteryStatus.Idle.ToString());
128                  break;
129              case BatteryStatus.Charging:
130                  //电池处于充电状态
131                  Debug.WriteLine(BatteryStatus.Charging.ToString());
132                  //正常模式
133                  this.RequestedTheme = ElementTheme.Default;
134                  break;
135              default:
136                  break;
137          }
138      }
139
140
141
142      /// <summary>
143      /// 获取 电池集 报告
144      /// </summary>
145      private async void RequestAggregateBatteryReport()
146      {
147          // 获取所有电池对象
148          var deviceInfo = await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
149          foreach (DeviceInformation device in deviceInfo)
150          {
151              try
152              {
153                  // 获取单个电池对象
154                  var battery = await Battery.FromIdAsync(device.Id);
155
156                  // 获取电池报告
157                  var report = battery.GetReport();
158
159                  // 更新UI
160                  AddReportUI(BatteryReportPanel, report, battery.DeviceId);
161              }
162              catch { /* Add error handling, as applicable */ }
163          }
164      }
165
166      private void GetBatteryReportButton_Click(object sender, RoutedEventArgs e)
167      {
168          // 清除 UI
169          BatteryReportPanel.Children.Clear();
170
171
172          if (AggregateButton.IsChecked == true)
173          {
174              // 获取多电池报告
175              RequestAggregateBatteryReport();
176          }
177          else
178          {
179              // 获取单电池报告
180              RequestIndividualBatteryReports();
181          }
182
183          reportRequested = true;
184      }
185  }

运行后我们可以看到,当电池状态处于放电时,界面会换成黑色主题来节约电池电量,当插上充电器时会换成默认的主题(我的默认是白色),实际开发中可根据电量百分比来决定是否切换节电主题来延长电池使用时间。

推荐一个UWP开发群:53078485 大家可以进来一起学习~~

时间: 2024-10-08 12:26:47

Win10/UWP新特性系列—电池报告的相关文章

Win10/UWP新特性系列—Launcher实现应用间的通信

UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器.App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用. 一:Launcher.LaunchFolde

Win10/UWP新特性系列-GetPublisherCacheFolder

微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的. 在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容.例如,多个应用程

Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能.使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中. 下面是个例子,我们需要打印一个购物清单,前台代码如下: 1 <Page.Resource

Win10/UWP新特性—Drag&amp;Drop 拖出元素到其他App

在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop App & UWP App中.昨天重新研究了Win10 拖拽这一块,发现以前没能实现的功能,在正式版的环境下都可以实现了,做个笔记以防日后忘记. 在UWP中,想要拖动元素到Desktop或者另一个UWP App中,除了设置元素的CanDrag="True"我们要使用元素的DragSt

Win10/UWP新特性—SharedStorageAccessManager 共享文件

首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStorageAccessManager,它允许我们的App根据指定的文件生成一个FileToken来共享此文件,其他App可以使用SharedStorageAccessManager. RedeemTokenForFileAsync(fileToken);方法根据FileToken来获取到共享的文件.这样

atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 1 1.3. 很少损坏不能启动(只有一次,2年,多机) 1 1.4. PC也可以触摸 1 2. win8 新特性 2 2.1. 2012年2月29日 2 2.2. Metro界面跨平台(移动平台,) 2 2.3. 本文导航 2 2.4. U盘上也可运行 2 3. win9 新特性 3 3.1. wi

UWP/Win10新特性系列—App Service

Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Api. 通过对外提供服务的形式,可以使App更好的完成一些其他App所拥有的专业性操作,而不必自己再去实现服务所做的操作.一些企业用户可以提供复杂的服务,比如云识别和云存储来供开发者使用.这样使开发成本大大降低,也可以为服务提供商带来更多的用户.比如我们可以调用二维码识别服务(如下图,假设其他App提

UWP/Win10新特性系列—UserConsentVerifier

在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的API,将生物识别认证和传统的密码识别封装为系统API供开发者调用,调用者只需关心认证的结果,而无需担心用户使用的是虹膜识别还是指纹还是密码等其他的识别技术. 通过UserConsentVerifier类可以提高应用程序的安全性,例如,你可以授权应用程序的购买,或者访问受限制的资源之前需要指纹验证.下面

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.