Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.
Les exemples de code proviennent de l’application de batterie de base répertoriée à la fin de cette rubrique.
- API importantes :BatteryReport, Windows.Devices.Power, DeviceInformation.FindAllAsync
Obtenir le rapport agrégé sur la batterie
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 aggregate représente tous les contrôleurs de batterie connectés à l’appareil et peut fournir un seul objet global BatteryReport.
Note
Une classe Battery 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 de batterie peut être null.
Une fois que vous avez un objet de 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 méthode Battery 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.
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. */ }
}
}
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 de l’API pour ses propriétés :
- État (valeur d’énumération BatteryStatus )
- ChargeRateInMilliwatts
- Capacité nominale en milliwattheures
- CapacitéDeChargeComplèteEnMilliwattheures
- RemainingCapacityInMilliwattHours.
Cet exemple montre quelques-unes des propriétés de rapport de batterie utilisées par l’application de batterie de base fournie 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 Battery 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 Battery 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 DispatcherQueue pour appeler les modifications apportées à l’interface utilisateur, comme illustré dans cet exemple.
private async void AggregateBattery_ReportUpdated(Battery sender, object args)
{
if (reportRequested)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, async () =>
{
await GetBatteryReport();
});
}
}
Exemple de code : application de batterie de base
Cet exemple montre comment utiliser les API de batterie pour afficher des informations sur la batterie dans l’interface utilisateur de l’application. Il contient une interface utilisateur XAML minimale, alors que l’interface utilisateur du rapport principal est créée dans le code-behind.
<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
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.
Windows developer