Поделиться через


Получение сведений об аккумуляторе

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

(BatteryReport)

Примеры кода относятся к базовому приложению батареи, указанному в конце этого раздела.

Важные API

Получение сводного отчета о батарее

Некоторые устройства имеют более одной батареи, и это не всегда очевидно, как каждая батарея способствует общей емкости энергии устройства. Это место, где входит класс AggregateBattery. Агрегатная батарея представляет все контроллеры батареи, подключенные к устройству, и может предоставлять один общий объект BatteryReport.

Обратите внимание, что класс батареи фактически соответствует контроллеру батареи. В зависимости от устройства, иногда контроллер подключен к физической батарее и иногда он подключен к корпусу устройства. Таким образом, можно создать объект батареи даже при отсутствии батареи. В других случаях объект батареи может иметь значение NULL.

Получив агрегатный объект батареи, вызовите GetReport, чтобы получить соответствующий объект BatteryReport.

private void RequestAggregateBatteryReport()
{
    // Create aggregate battery object
    var aggBattery = Battery.AggregateBattery;

    // Get report
    var report = aggBattery.GetReport();

    // Update UI
    AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
}

Получение отдельных отчетов о батарее

Можно также создать объект BatteryReport для отдельных батарей. Используйте Метод GetDeviceSelector с методом FindAllAsync, чтобы получить коллекцию объектов DeviceInformation, представляющих любые контроллеры батареи, подключенные к устройству. Затем с помощью свойства Id нужного объекта DeviceInformation создайте соответствующую батарею с помощью метода FromIdAsync. Наконец, вызовите GetReport , чтобы получить отдельный отчет о батарее.

В этом примере показано, как создать отчет о батарее для всех батарей, подключенных к устройству.

async private void RequestIndividualBatteryReports()
{
    // Find batteries 
    var deviceInfo = await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
    foreach(DeviceInformation device in deviceInfo)
    {
        try
        {
        // Create battery object
        var battery = await Battery.FromIdAsync(device.Id);

        // Get report
        var report = battery.GetReport();

        // Update UI
        AddReportUI(BatteryReportPanel, report, battery.DeviceId);
        }
        catch { /* Add error handling, as applicable */ }
    }
}

Доступ к сведениям о отчете

Объект BatteryReport предоставляет много сведений о батарее. Дополнительные сведения см. в справочнике по API для его свойств: Status (перечисление BatteryStatus), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHours и RemainingCapacityInMilliwattHours. В этом примере показаны некоторые свойства отчета о батарее, используемые базовым приложением батареи, которое представлено далее в этом разделе.

...
TextBlock txt3 = new TextBlock { Text = "Charge rate (mW): " + report.ChargeRateInMilliwatts.ToString() };
TextBlock txt4 = new TextBlock { Text = "Design energy capacity (mWh): " + report.DesignCapacityInMilliwattHours.ToString() };
TextBlock txt5 = new TextBlock { Text = "Fully-charged energy capacity (mWh): " + report.FullChargeCapacityInMilliwattHours.ToString() };
TextBlock txt6 = new TextBlock { Text = "Remaining energy capacity (mWh): " + report.RemainingCapacityInMilliwattHours.ToString() };
...
...

Запрос обновлений отчета

Объект батареи активирует событие ReportUpdated при изменении заряда, емкости или состояния батареи. Обычно это происходит немедленно для изменений состояния и периодически для всех других изменений. В этом примере показано, как зарегистрировать обновления отчета о батарее.

...
Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
...

Обработка обновлений отчетов

При обновлении батареи событие ReportUpdated передает соответствующий объект Battery методу обработчика событий. Однако этот обработчик событий не вызывается из потока пользовательского интерфейса. Для вызова изменений пользовательского интерфейса необходимо использовать объект Диспетчера , как показано в этом примере.

async private void AggregateBattery_ReportUpdated(Battery sender, object args)
{
    if (reportRequested)
    {

        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            // Clear UI
            BatteryReportPanel.Children.Clear();


            if (AggregateButton.IsChecked == true)
            {
                // Request aggregate battery report
                RequestAggregateBatteryReport();
            }
            else
            {
                // Request individual battery report
                RequestIndividualBatteryReports();
            }
        });
    }
}

Пример: базовое приложение батареи

Проверьте эти API, создав следующее базовое приложение батареи в Microsoft Visual Studio. На начальной странице Visual Studio нажмите кнопку "Создать проект", а затем в универсальных шаблонах Windows > Visual C# > создайте новое приложение с помощью шаблона пустого приложения.

Затем откройте файл MainPage.xaml и скопируйте следующий XML-файл в этот файл (заменив исходное содержимое).

Примечание.

Если приложение не называется App1, необходимо заменить первую часть имени класса в следующем фрагменте кода пространством имен приложения. Например, если вы создали проект с именем BasicBatteryApp, замените x:Class="App1.MainPage" его x:Class="BasicBatteryApp.MainPage" и xmlns:local="using:App1" на xmlns:local="using:BasicBatteryApp".

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
        <StackPanel VerticalAlignment="Center" Margin="15,30,0,0" >
            <RadioButton x:Name="AggregateButton" Content="Aggregate results" GroupName="Type" IsChecked="True" />
            <RadioButton x:Name="IndividualButton" Content="Individual results" GroupName="Type" IsChecked="False" />
        </StackPanel>
        <StackPanel Orientation="Horizontal">
        <Button x:Name="GetBatteryReportButton" 
                Content="Get battery report" 
                Margin="15,15,0,0" 
                Click="GetBatteryReport"/>
        </StackPanel>
        <StackPanel x:Name="BatteryReportPanel" Margin="15,15,0,0"/>
    </StackPanel>
</Page>

Затем откройте файл MainPage.xaml.cs проекта и замените существующий код следующим.

Примечание.

Если приложение не называется App1, необходимо переименовать пространство имен в следующем примере с именем, которое вы предоставили проекту. Например, если вы создали проект с именем BasicBatteryApp, вы замените пространство App1 имен пространством BasicBatteryAppимен.

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.Devices.Enumeration;
using Windows.Devices.Power;
using Windows.UI.Core;

namespace App1
{
    public sealed partial class MainPage : Page
    {
        bool reportRequested = false;
        public MainPage()
        {
            this.InitializeComponent();
            Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
        }


        private void GetBatteryReport(object sender, RoutedEventArgs e)
        {
            // Clear UI
            BatteryReportPanel.Children.Clear();


            if (AggregateButton.IsChecked == true)
            {
                // Request aggregate battery report
                RequestAggregateBatteryReport();
            }
            else
            {
                // Request individual battery report
                RequestIndividualBatteryReports();
            }

            // Note request
            reportRequested = true;
        }

        private void RequestAggregateBatteryReport()
        {
            // Create aggregate battery object
            var aggBattery = Battery.AggregateBattery;

            // Get report
            var report = aggBattery.GetReport();

            // Update UI
            AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
        }

        async private void RequestIndividualBatteryReports()
        {
            // Find batteries 
            var deviceInfo = await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
            foreach(DeviceInformation device in deviceInfo)
            {
                try
                {
                // Create battery object
                var battery = await Battery.FromIdAsync(device.Id);

                // Get report
                var report = battery.GetReport();

                // Update UI
                AddReportUI(BatteryReportPanel, report, battery.DeviceId);
                }
                catch { /* Add error handling, as applicable */ }
            }
        }


        private void AddReportUI(StackPanel sp, BatteryReport report, string DeviceID)
        {
            // Create battery report UI
            TextBlock txt1 = new TextBlock { Text = "Device ID: " + DeviceID };
            txt1.FontSize = 15;
            txt1.Margin = new Thickness(0, 15, 0, 0);
            txt1.TextWrapping = TextWrapping.WrapWholeWords;

            TextBlock txt2 = new TextBlock { Text = "Battery status: " + report.Status.ToString() };
            txt2.FontStyle = Windows.UI.Text.FontStyle.Italic;
            txt2.Margin = new Thickness(0, 0, 0, 15);

            TextBlock txt3 = new TextBlock { Text = "Charge rate (mW): " + report.ChargeRateInMilliwatts.ToString() };
            TextBlock txt4 = new TextBlock { Text = "Design energy capacity (mWh): " + report.DesignCapacityInMilliwattHours.ToString() };
            TextBlock txt5 = new TextBlock { Text = "Fully-charged energy capacity (mWh): " + report.FullChargeCapacityInMilliwattHours.ToString() };
            TextBlock txt6 = new TextBlock { Text = "Remaining energy capacity (mWh): " + report.RemainingCapacityInMilliwattHours.ToString() };

            // Create energy capacity progress bar & labels
            TextBlock pbLabel = new TextBlock { Text = "Percent remaining energy capacity" };
            pbLabel.Margin = new Thickness(0,10, 0, 5);
            pbLabel.FontFamily = new FontFamily("Segoe UI");
            pbLabel.FontSize = 11;

            ProgressBar pb = new ProgressBar();
            pb.Margin = new Thickness(0, 5, 0, 0);
            pb.Width = 200;
            pb.Height = 10;
            pb.IsIndeterminate = false;
            pb.HorizontalAlignment = HorizontalAlignment.Left;

            TextBlock pbPercent = new TextBlock();
            pbPercent.Margin = new Thickness(0, 5, 0, 10);
            pbPercent.FontFamily = new FontFamily("Segoe UI");
            pbLabel.FontSize = 11;

            // Disable progress bar if values are null
            if ((report.FullChargeCapacityInMilliwattHours == null)||
                (report.RemainingCapacityInMilliwattHours == null))
            {
                pb.IsEnabled = false;
                pbPercent.Text = "N/A";
            }
            else
            {
                pb.IsEnabled = true;
                pb.Maximum = Convert.ToDouble(report.FullChargeCapacityInMilliwattHours);
                pb.Value = Convert.ToDouble(report.RemainingCapacityInMilliwattHours);
                pbPercent.Text = ((pb.Value / pb.Maximum) * 100).ToString("F2") + "%";
            }

            // Add controls to stackpanel
            sp.Children.Add(txt1);
            sp.Children.Add(txt2);
            sp.Children.Add(txt3);
            sp.Children.Add(txt4);
            sp.Children.Add(txt5);
            sp.Children.Add(txt6);
            sp.Children.Add(pbLabel);
            sp.Children.Add(pb);
            sp.Children.Add(pbPercent);
        }

        async private void AggregateBattery_ReportUpdated(Battery sender, object args)
        {
            if (reportRequested)
            {

                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    // Clear UI
                    BatteryReportPanel.Children.Clear();


                    if (AggregateButton.IsChecked == true)
                    {
                        // Request aggregate battery report
                        RequestAggregateBatteryReport();
                    }
                    else
                    {
                        // Request individual battery report
                        RequestIndividualBatteryReports();
                    }
                });
            }
        }
    }
}

Совет

Чтобы получить числовые значения из объекта BatteryReport, отладите приложение на локальном компьютере или внешнем устройстве. При отладке в эмуляторе устройства объект BatteryReport возвращает значение NULL к свойствам емкости и скорости.