Partager via


Obtenir des informations sur la batterie

Cette rubrique explique comment obtenir un rapport de batterie qui inclut des informations détaillées sur la batterie (telles que la charge, la capacité et l’état d’une batterie ou un agrégat de batteries) et gérer les modifications d’état apportées aux éléments du rapport.

(BatteryReport)

Les exemples de code proviennent de l’application de batterie de base répertoriée à la fin de cette rubrique.

API importantes

Obtenir le rapport de batterie d’agrégation

Certains appareils ont plusieurs batteries et il n’est pas toujours évident comment chaque batterie contribue à la capacité énergétique globale de l’appareil. C’est là que la classe AggregateBattery est entrée. La batterie agrégée représente tous les contrôleurs de batterie connectés à l’appareil et peut fournir un seul objet BatteryReport global.

Notez qu’une classe batterie correspond réellement à un contrôleur de batterie. Selon l’appareil, le contrôleur est parfois attaché à la batterie physique et il est parfois attaché au boîtier de l’appareil. Ainsi, il est possible de créer un objet batterie même quand aucune batterie n’est présente. D’autres fois, l’objet batterie peut être null.

Une fois que vous avez un objet batterie agrégé, appelez GetReport pour obtenir le BatteryReport correspondant.

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

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

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

Obtenir des rapports de batterie individuels

Vous pouvez également créer un objet BatteryReport pour des batteries individuelles. Utilisez GetDeviceSelector avec la méthode FindAllAsync pour obtenir une collection d’objets DeviceInformation qui représentent les contrôleurs de batterie connectés à l’appareil. Ensuite, à l’aide de la propriété ID de l’objet DeviceInformation souhaité, créez une batterie correspondante avec la méthode FromIdAsync. Enfin, appelez GetReport pour obtenir le rapport de batterie individuel.

Cet exemple montre comment créer un rapport de batterie pour toutes les batteries connectées à l’appareil.

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

Accéder aux détails du rapport

L’objet BatteryReport fournit beaucoup d’informations sur la batterie. Pour plus d’informations, consultez la référence d’API pour ses propriétés : Status (énumération BatteryStatus), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHours et RemainingCapacityInMilliwattHours. Cet exemple montre quelques-unes des propriétés de rapport de batterie utilisées par l’application batterie de base, fournies plus loin dans cette rubrique.

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

Demander des mises à jour de rapport

L’objet Batterie déclenche l’événement ReportUpdated lorsque la charge, la capacité ou l’état de la batterie change. Cela se produit généralement immédiatement pour les modifications d’état et régulièrement pour toutes les autres modifications. Cet exemple montre comment s’inscrire pour les mises à jour des rapports de batterie.

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

Gérer les mises à jour de rapport

Lorsqu’une mise à jour de batterie se produit, l’événement ReportUpdated transmet l’objet Batterie correspondant à la méthode du gestionnaire d’événements. Toutefois, ce gestionnaire d’événements n’est pas appelé à partir du thread d’interface utilisateur. Vous devez utiliser l’objet Dispatcher pour appeler les modifications apportées à l’interface utilisateur, comme illustré dans cet exemple.

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

Exemple : application de batterie de base

Testez ces API en créant l’application de batterie de base suivante dans Microsoft Visual Studio. Dans la page de démarrage de Visual Studio, cliquez sur Nouveau projet, puis, sous les modèles Windows Universels > Visual C#>, créez une application à l’aide du modèle d’application vide.

Ensuite, ouvrez le fichier MainPage.xaml et copiez le code XML suivant dans ce fichier (en remplaçant son contenu d’origine).

Remarque

Si votre application n’est pas nommée App1, vous devez remplacer la première partie du nom de classe dans l’extrait de code suivant par l’espace de noms de votre application. Par exemple, si vous avez créé un projet nommé BasicBatteryApp, remplacez x:Class="App1.MainPage" par x:Class="BasicBatteryApp.MainPage" et xmlns:local="using:App1" par 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>

Ensuite, ouvrez le fichier MainPage.xaml.cs de votre projet et remplacez le code existant par ce qui suit.

Remarque

Si votre application n’est pas nommée App1, vous devez renommer l’espace de noms dans l’exemple suivant avec le nom que vous avez donné à votre projet. Par exemple, si vous avez créé un projet nommé BasicBatteryApp, vous remplacez l’espace de noms App1 par l’espace de noms 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();
                    }
                });
            }
        }
    }
}

Conseil

Pour recevoir des valeurs numériques à partir de l’objet BatteryReport, déboguez votre application sur l’ordinateur local ou un appareil externe. Lors du débogage sur un émulateur d’appareil, l’objet BatteryReport retourne null aux propriétés de capacité et de débit.