Freigeben über


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.

(BatteryReport)

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

Wichtige APIs

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 Ziel. Der Aggregierte Akku stellt alle an das Gerät angeschlossenen Akkucontroller dar und kann ein einzelnes gesamtes BatteryReport -Objekt bereitstellen.

Hinweis Eine Akkuklasse 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 null sein.

Sobald Sie über ein aggregiertes Akkuobjekt verfügen, rufen Sie GetReport auf, um den entsprechenden 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);
}

Abrufen einzelner Akkuberichte

Sie können auch ein BatteryReport-Objekt für einzelne Batterien erstellen. Verwenden Sie GetDeviceSelector mit der FindAllAsync-Methode, um eine Sammlung von DeviceInformation-Objekten abzurufen, die alle Akkucontroller darstellen, die mit dem Gerät verbunden sind. Erstellen Sie dann mithilfe der ID-Eigenschaft des gewünschten DeviceInformation-Objekts einen entsprechenden Akku mit der FromIdAsync-Methode. 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.

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

Details des Zugriffsberichts

Das BatteryReport-Objekt bietet viele Akkuinformationen. Weitere Informationen finden Sie in der API-Referenz für seine Eigenschaften: Status (eine BatteryStatus-Aufzählung), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHours und RemainingCapacityInMilliwattHours. Dieses Beispiel zeigt einige der Eigenschaften des Akkuberichts, die von der einfachen Akku-App verwendet werden, die weiter unten in diesem Thema bereitgestellt 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 Battery-Objekt löst das ReportUpdated-Ereignis aus, wenn sich Lade-, Kapazitäts- 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;
...

Behandeln von Berichtsaktualisierungen

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

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

Beispiel: Einfache Akku-App

Testen Sie diese APIs, indem Sie die folgende einfache Akku-App in Microsoft Visual Studio erstellen. Klicken Sie auf der Visual Studio-Startseite auf "Neues Projekt", und erstellen Sie dann unter den universellen Visual C#>-Vorlagen für Windows > eine neue App mit der Vorlage "Leere App".

Öffnen Sie als Nächstes die Datei "MainPage.xaml ", und kopieren Sie den folgenden XML-Code in diese Datei (ersetzen Sie den ursprünglichen Inhalt).

Hinweis

Wenn Ihre App nicht mit dem Namen "App1" bezeichnet wird, müssen Sie den ersten Teil des Klassennamens im folgenden Codeausschnitt durch den Namespace Ihrer App ersetzen. Wenn Sie beispielsweise ein Projekt mit dem Namen BasicBatteryApp erstellt haben, ersetzen Sie x:Class="App1.MainPage" es durch x:Class="BasicBatteryApp.MainPage" und xmlns:local="using:App1" durch 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>

Öffnen Sie als Nächstes die MainPage.xaml.cs Datei Ihres Projekts, und ersetzen Sie den vorhandenen Code durch Folgendes.

Hinweis

Wenn Ihre App nicht mit dem Namen "App1" bezeichnet wird, müssen Sie den Namespace im folgenden Beispiel mit dem Namen umbenennen, den Sie ihrem Projekt gegeben haben. Wenn Sie beispielsweise ein Projekt mit dem Namen BasicBatteryApp erstellt haben, ersetzen Sie den Namespace App1 durch den Namespace 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();
                    }
                });
            }
        }
    }
}

Tipp

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.