Abrufen von Akkuinformationen

In diesem Thema wird beschrieben, wie Sie einen Akkubericht mit detaillierten Akkuinformationen (z. B. Ladung, Kapazität und Status einer Batterie oder Akkuaggregat) abrufen und Zustandsänderungen an allen Elementen im Bericht behandeln.

Codebeispiele stammen aus der einfachen Akku-App, die am Ende dieses Themas aufgeführt ist.

Abrufen eines aggregierten Akkuberichts

Einige Geräte verfügen über mehr als einen Akku, und es ist nicht immer offensichtlich, wie jeder Akku zur Gesamtenergiekapazität des Geräts beiträgt. Hier kommt die AggregateBattery-Klasse ins Spiel. Die aggregierte Batterie umfasst alle mit dem Gerät verbundenen Batteriecontroller und kann ein einziges allgemeines BatteryReport-Objekt bereitstellen.

Note

Eine BatteryKlasse entspricht tatsächlich einem Akkucontroller. Je nach Gerät ist der Controller manchmal an den physischen Akku angeschlossen und manchmal an das Gerätegehäuse angeschlossen. So ist es möglich, auch dann ein Akkuobjekt zu erstellen, wenn keine Batterien vorhanden sind. In anderen Zeiten kann das Akkuobjekt sein null.

Sobald Sie über ein aggregiertes Akkuobjekt verfügen, rufen Sie GetReport auf, um das entsprechende BatteryReport abzurufen.

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

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

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

Einzelne Akkuberichte abrufen

Sie können auch ein BatteryReportObjekt für einzelne Batterien erstellen. Verwenden Sie GetDeviceSelector mit der FindAllAsyncMethode, um eine Auflistung von DeviceInformation Objekten abzurufen, die alle Akkucontroller darstellen, die mit dem Gerät verbunden sind. Erstellen Sie dann mithilfe der eigenschaft Id des gewünschten DeviceInformation-Objekts eine entsprechende Battery mit der methode FromIdAsync. Rufen Sie schließlich GetReport auf, um den einzelnen Akkubericht abzurufen.

In diesem Beispiel wird gezeigt, wie Sie einen Akkubericht für alle batterien erstellen, die mit dem Gerät verbunden sind.

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. */ }
    }
}

Details des Zugriffsberichts

Das objekt BatteryReport stellt viele Akkuinformationen bereit. Weitere Informationen finden Sie in der API-Referenz für die zugehörigen Eigenschaften:

Dieses Beispiel zeigt einige der Eigenschaften des Batterieberichts, die von der einfachen Batterie-App verwendet werden, die weiter unten in diesem Thema vorgestellt wird.

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

Anfordern von Berichtsaktualisierungen

Das objekt Battery löst das ereignis ReportUpdated aus, wenn sich lade, kapazität oder status der Batterie ändert. Dies geschieht in der Regel sofort für Statusänderungen und regelmäßig für alle anderen Änderungen. In diesem Beispiel wird gezeigt, wie Sie sich für Aktualisierungen des Akkuberichts registrieren.

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

Berichtsaktualisierungen verarbeiten

Wenn ein Akkuupdate auftritt, übergibt das ReportUpdatedEreignis das entsprechende Battery-Objekt an die Ereignishandlermethode. Dieser Ereignishandler wird jedoch nicht aus dem UI-Thread aufgerufen. Sie müssen das DispatcherQueue-Objekt verwenden, um ui-Änderungen aufzurufen, wie in diesem Beispiel gezeigt.

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

Beispielcode: einfache Akku-App

In diesem Beispiel wird die Verwendung der Akku-APIs zum Anzeigen von Akkuinformationen auf der Benutzeroberfläche der App veranschaulicht. Sie enthält eine minimale XAML-Benutzeroberfläche, während die Hauptbericht-UI im CodeBehind erstellt wird.

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

Tip

Um numerische Werte aus dem BatteryReport-Objekt zu erhalten, debuggen Sie Ihre App auf dem lokalen Computer oder einem externen Gerät. Beim Debuggen auf einem Geräteemulator gibt das BatteryReport-Objekt null an die Kapazitäts- und Rateeigenschaften zurück.