Dela via


Hämta batteriinformation

I det här avsnittet beskrivs hur du hämtar en batterirapport som innehåller detaljerad batteriinformation (till exempel laddning, kapacitet och status för ett batteri eller en mängd batterier) och hanterar tillståndsändringar för alla objekt i rapporten.

(BatteriRapport)

Kodexempel kommer från den grundläggande batteriappen som visas i slutet av det här avsnittet.

viktiga API:er

Hämta aggregerad batterirapport

Vissa enheter har mer än ett batteri och det är inte alltid uppenbart hur varje batteri bidrar till enhetens totala energikapacitet. Här kommer klassen AggregateBattery in i bilden. Det aggregerade batteriet representerar alla batteristyrenheter som är anslutna till enheten och kan ge ett enda övergripande BatteryReport-objekt.

Notera A Batteri-klass motsvarar faktiskt en batteristyrenhet. Beroende på enheten är styrenheten ibland ansluten till det fysiska batteriet och ibland är den ansluten till enhetens hölje. Därför är det möjligt att skapa ett batteriobjekt även när det inte finns några batterier. Andra gånger kan batteriobjektet vara null.

När du har ett sammanställt batteriobjekt, anropar du GetReport för att hämta den motsvarande 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);
}

Hämta enskilda batterirapporter

Du kan också skapa ett BatteryReport- objekt för enskilda batterier. Använd GetDeviceSelector med metoden FindAllAsync för att hämta en samling DeviceInformation objekt som representerar alla batteristyrenheter som är anslutna till enheten. Använd sedan egenskapen ID för det önskade objektet DeviceInformation och skapa en motsvarande Battery med metoden FromIdAsync. Anropa slutligen GetReport för att hämta den enskilda batterirapporten.

Det här exemplet visar hur du skapar en batterirapport för alla batterier som är anslutna till enheten.

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

Åtkomst till rapportinformation

Objektet BatteryReport innehåller mycket batteriinformation. Övrig information finns i API-referensen om dess egenskaper: Status (en BatteryStatus uppräkningstyp), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHoursoch RemainingCapacityInMilliwattHours. Det här exemplet visar några av de batterirapportegenskaper som används av den grundläggande batteriappen, som tillhandahålls senare i det här avsnittet.

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

Begära rapportuppdateringar

Objektet Battery utlöser händelsen ReportUpdated när batteriets laddning, kapacitet eller status ändras. Detta sker vanligtvis omedelbart för statusändringar och med jämna mellanrum för alla andra ändringar. Det här exemplet visar hur du registrerar dig för uppdateringar av batterirapporter.

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

Hantera rapportuppdateringar

När en batteriuppdatering inträffar skickar händelsen ReportUpdated motsvarande Battery-objekt till händelsehanterarmetoden. Den här händelsehanteraren anropas dock inte från användargränssnittstråden. Du måste använda objektet Dispatcher för att anropa ändringar i användargränssnittet, som du ser i det här exemplet.

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

Exempel: grundläggande batteriapp

Testa dessa API:er genom att skapa följande grundläggande batteriapp i Microsoft Visual Studio. På Visual Studio-startsidan klickar du på Nytt projektoch under mallarna Visual C# > Windows > Universal skapar du sedan en ny app med mallen Tom app.

Öppna sedan filen MainPage.xaml och kopiera följande XML till den här filen (ersätta dess ursprungliga innehåll).

Anmärkning

Om din app inte heter App1måste du ersätta den första delen av klassnamnet i följande kodavsnitt med appens namnområde. Om du till exempel har skapat ett projekt med namnet BasicBatteryAppersätter du x:Class="App1.MainPage" med x:Class="BasicBatteryApp.MainPage" och xmlns:local="using:App1" med 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>

Öppna sedan projektets MainPage.xaml.cs-fil och ersätt den befintliga koden med följande.

Anmärkning

Om appen inte heter App1måste du byta namn på namnområdet i följande exempel med det namn som du gav projektet. Om du till exempel har skapat ett projekt med namnet BasicBatteryAppersätter du namnområdet App1 med namnområdet 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();
                    }
                });
            }
        }
    }
}

Tips/Råd

Om du vill ta emot numeriska värden från objektet BatteryReport kan du felsöka appen på lokal dator eller en extern Device. När du felsöker en enhetsemulator returnerar objektet BatteryReportnull- till kapacitets- och hastighetsegenskaperna.