Delen via


Batterijgegevens ophalen

In dit onderwerp wordt beschreven hoe u een batterijrapport krijgt met gedetailleerde informatie over de batterij (zoals de lading, capaciteit en status van een batterij of aggregaties van accu's), en statuswijzigingen in items in het rapport afhandelt.

(AccuRapport)

Codevoorbeelden zijn afkomstig uit de eenvoudige batterij-app die aan het einde van dit onderwerp wordt vermeld.

Belangrijke API's

Aggregaat batterijrapport ophalen

Sommige apparaten hebben meer dan één batterij en het is niet altijd duidelijk hoe elke batterij bijdraagt aan de totale energiecapaciteit van het apparaat. Hier speelt de klasse AggregateBattery een rol. De geaggregeerde batterij vertegenwoordigt alle accucontrollers die zijn verbonden met het apparaat en kunnen één algemeen BatteryReport object leveren.

Note A Battery klasse komt eigenlijk overeen met een batterijcontroller. Afhankelijk van het apparaat, wordt de controller soms aangesloten op de fysieke batterij en soms is het aangesloten op de behuizing van het apparaat. Het is dus mogelijk om een batterijobject te maken, zelfs als er geen batterijen aanwezig zijn. In andere gevallen kan het batterijobject null-zijn.

Zodra u een geaggregeerd batterijobject hebt, roept u GetReport- aan om de bijbehorende BatteryReport-op te halen.

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

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

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

Afzonderlijke batterijrapporten ophalen

U kunt ook een BatteryReport object maken voor afzonderlijke batterijen. Gebruik GetDeviceSelector- met de methode FindAllAsync om een verzameling DeviceInformation--objecten te verkrijgen die eventuele accucontrollers vertegenwoordigen die zijn verbonden met het apparaat. Maak vervolgens met behulp van de eigenschap Id van het gewenste DeviceInformation-object een overeenkomende Battery- met de methode FromIdAsync. Roep tot slot GetReport- aan om het afzonderlijke batterijrapport op te halen.

In dit voorbeeld ziet u hoe u een batterijrapport maakt voor alle batterijen die zijn aangesloten op het apparaat.

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 van toegangsrapport

Het BatteryReport object biedt veel informatie over de batterij. Zie voor meer informatie de API-verwijzing voor de eigenschappen: Status (een BatteryStatus opsomming), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHoursen RemainingCapacityInMilliwattHours. In dit voorbeeld ziet u enkele eigenschappen van het batterijrapport die worden gebruikt door de eenvoudige batterij-app, die verderop in dit onderwerp wordt gegeven.

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

Rapportupdates aanvragen

Het object Battery activeert de gebeurtenis ReportUpdated wanneer de accu wordt opgeladen, capaciteit of status verandert. Dit gebeurt meestal onmiddellijk voor statuswijzigingen en regelmatig voor alle andere wijzigingen. In dit voorbeeld ziet u hoe u zich registreert voor updates van accurapport.

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

Rapportupdates verwerken

Wanneer een batterijupdate plaatsvindt, geeft de gebeurtenis ReportUpdated het bijbehorende Battery-object door aan de gebeurtenishandlermethode. Deze gebeurtenis-handler wordt echter niet aangeroepen vanuit de UI-thread. U moet het Dispatcher--object gebruiken om wijzigingen in de gebruikersinterface aan te roepen, zoals in dit voorbeeld wordt weergegeven.

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

Voorbeeld: eenvoudige batterij-app

Test deze API's door de volgende eenvoudige batterij-app te bouwen in Microsoft Visual Studio. Klik op de startpagina van Visual Studio op Nieuw projecten maak vervolgens onder de sjablonen voor Visual C# > Windows > Universal een nieuwe app met behulp van de sjabloon Lege app.

Open vervolgens het bestand MainPage.xaml en kopieer de volgende XML naar dit bestand (waarbij de oorspronkelijke inhoud wordt vervangen).

Opmerking

Als uw app geen naam heeft App1, moet u het eerste deel van de klassenaam in het volgende codefragment vervangen door de naamruimte van uw app. Als u bijvoorbeeld een project met de naam BasicBatteryApphebt gemaakt, vervangt u x:Class="App1.MainPage" door x:Class="BasicBatteryApp.MainPage" en xmlns:local="using:App1" door 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>

Open vervolgens het MainPage.xaml.cs-bestand van uw project en vervang de bestaande code door het volgende.

Opmerking

Als uw app geen naam heeft App1, moet u de naamruimte in het volgende voorbeeld wijzigen met de naam die u uw project hebt gegeven. Als u bijvoorbeeld een project met de naam BasicBatteryApphebt gemaakt, vervangt u naamruimte App1 door naamruimte 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();
                    }
                });
            }
        }
    }
}

Aanbeveling

Als u numerieke waarden wilt ontvangen uit het BatteryReport-object, debuggen dan uw app op de lokale machine of op een extern apparaat. Bij foutopsporing op een apparaatemulator retourneert het BatteryReport-object null- aan de capaciteits- en snelheidseigenschappen.