Pobieranie informacji o baterii

W tym artykule opisano, jak uzyskać raport dotyczący baterii, który zawiera szczegółowe informacje o baterii (takie jak poziom naładowania, pojemność i stan baterii lub zestawu baterii), oraz jak obsługiwać zmiany stanu dowolnych elementów ujętych w raporcie.

Przykłady kodu pochodzą z podstawowej aplikacji baterii wymienionej na końcu tego tematu.

Uzyskiwanie zagregowanego raportu baterii

Niektóre urządzenia mają więcej niż jedną baterię i nie zawsze jest oczywiste, jak każda bateria przyczynia się do ogólnej pojemności energetycznej urządzenia. W tym miejscu znajduje się klasa AggregateBattery . Bateria zbiorcza reprezentuje wszystkie kontrolery baterii podłączone do urządzenia i może udostępniać pojedynczy ogólny obiekt BatteryReport.

Note

Klasa Battery faktycznie odpowiada kontrolerowi baterii. W zależności od urządzenia czasami kontroler jest podłączony do baterii fizycznej, a czasami jest podłączony do obudowy urządzenia. W związku z tym można utworzyć obiekt baterii nawet wtedy, gdy nie ma żadnych baterii. Innym razem obiekt baterii może mieć wartość null.

Gdy masz już zagregowany obiekt baterii, wywołaj GetReport, aby uzyskać odpowiedni obiekt 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);
}

Pobieranie poszczególnych raportów dotyczących baterii

Można również utworzyć obiekt BatteryReport dla poszczególnych baterii. Użyj GetDeviceSelector z metodą FindAllAsync, aby uzyskać kolekcję obiektów DeviceInformation, które reprezentują wszelkie kontrolery baterii podłączone do urządzenia. Następnie za pomocą właściwości Id żądanego obiektu DeviceInformation utwórz odpowiedni Battery za pomocą metody FromIdAsync. Na koniec wywołaj metodę GetReport , aby uzyskać indywidualny raport baterii.

W tym przykładzie pokazano, jak utworzyć raport baterii dla wszystkich baterii podłączonych do urządzenia.

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

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

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

Uzyskiwanie dostępu do szczegółów raportu

Obiekt BatteryReport zapewnia wiele informacji o baterii. Aby uzyskać więcej informacji, zobacz dokumentację interfejsu API dotyczącą jej właściwości:

Ten przykład przedstawia niektóre właściwości raportu o baterii używane przez prostą aplikację obsługi baterii przedstawioną w dalszej części tego tematu.

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() };

Żądanie aktualizacji raportu

Obiekt Battery wyzwala zdarzenie ReportUpdated, gdy zmienia się poziom naładowania, pojemność lub stan baterii. Zazwyczaj dzieje się to natychmiast w przypadku zmian stanu i okresowo dla wszystkich innych zmian. W tym przykładzie pokazano, jak zarejestrować się w celu aktualizacji raportu baterii.

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

Obsługa aktualizacji raportów

Gdy nastąpi aktualizacja baterii, zdarzenie ReportUpdated przekazuje odpowiedni obiekt Battery do metody obsługi zdarzenia. Jednak ta procedura obsługi zdarzeń nie jest wywoływana z wątku interfejsu użytkownika. Aby wywołać zmiany interfejsu użytkownika, należy użyć obiektu DispatcherQueue , jak pokazano w tym przykładzie.

private async void AggregateBattery_ReportUpdated(Battery sender, object args)
{
    if (reportRequested)
    {
        DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, async () =>
        {
            await GetBatteryReport();
        });
    }
}

Przykładowy kod: podstawowa aplikacja baterii

W tym przykładzie pokazano, jak używać interfejsów API baterii do wyświetlania informacji o baterii w interfejsie użytkownika aplikacji. Zawiera minimalny interfejs użytkownika w języku XAML, podczas gdy główny interfejs użytkownika raportu jest tworzony w pliku code-behind.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel x:Name="topPanel" Margin="24">
        <RadioButtons>
            <RadioButton x:Name="AggregateButton" Content="Aggregate results" IsChecked="True" />
            <RadioButton x:Name="IndividualButton" Content="Individual results"/>
        </RadioButtons>
        <Button Content="Get battery report" Click="GetReportButton_Click"  Margin="0,12,0,0"/>
    </StackPanel>

    <StackPanel x:Name="BatteryReportPanel" Grid.Row="1" Margin="24,0"/>
</Grid>
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using Windows.Devices.Enumeration;
using Windows.Devices.Power;

namespace DevicesDemo.Pages
{
    public sealed partial class BatteryInfoPage : Page
    {
        bool reportRequested = false;

        public BatteryInfoPage()
        {
            InitializeComponent();

            Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
        }

        private async void AggregateBattery_ReportUpdated(Battery sender, object args)
        {
            if (reportRequested)
            {
                DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, async () =>
                {
                    await GetBatteryReport();
                });
            }
        }

        private async void GetReportButton_Click(object sender, RoutedEventArgs e)
        {
            await GetBatteryReport();
        }

        private async Task GetBatteryReport()
        {
            // Clear UI.
            BatteryReportPanel.Children.Clear();

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

            // Note request.
            reportRequested = true;
        }

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

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

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

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

                    // Get report.
                    BatteryReport 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);
        }
    }
}

Wskazówka

Aby odbierać wartości liczbowe z obiektu BatteryReport, debuguj aplikację na komputerze lokalnym lub urządzeniu zewnętrznym. Podczas debugowania w emulatorze urządzenia obiekt BatteryReport zwraca wartość null do właściwości pojemności i szybkości.