Mendapatkan informasi baterai

Topik ini menjelaskan cara mendapatkan laporan baterai yang mencakup informasi baterai terperinci (seperti pengisian daya, kapasitas, dan status baterai atau agregat baterai), dan menangani perubahan status pada item apa pun dalam laporan.

(BatteryReport)

Contoh kode berasal dari aplikasi baterai dasar yang tercantum di akhir topik ini.

API penting

Mendapatkan laporan baterai agregat

Beberapa perangkat memiliki lebih dari satu baterai dan tidak selalu jelas bagaimana setiap baterai berkontribusi pada kapasitas energi perangkat secara keseluruhan. Di sinilah kelas AggregateBattery masuk. Baterai agregat mewakili semua pengontrol baterai yang terhubung ke perangkat dan dapat menyediakan satu objek BatteryReport secara keseluruhan.

Catatan Kelas Baterai sebenarnya sesuai dengan pengontrol baterai. Tergantung pada perangkat, terkadang pengontrol terpasang pada baterai fisik dan terkadang terpasang pada penutup perangkat. Dengan demikian, dimungkinkan untuk membuat objek baterai bahkan ketika tidak ada baterai. Di lain waktu, objek baterai mungkin null.

Setelah Anda memiliki objek baterai agregat, panggil GetReport untuk mendapatkan BatteryReport yang sesuai.

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

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

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

Mendapatkan laporan baterai individual

Anda juga dapat membuat objek BatteryReport untuk masing-masing baterai. Gunakan GetDeviceSelector dengan metode FindAllAsync untuk mendapatkan koleksi objek DeviceInformation yang mewakili pengontrol baterai apa pun yang terhubung ke perangkat. Kemudian, menggunakan properti Id dari objek DeviceInformation yang diinginkan, buat Baterai yang sesuai dengan metode FromIdAsync . Terakhir, hubungi GetReport untuk mendapatkan laporan baterai individual.

Contoh ini menunjukkan cara membuat laporan baterai untuk semua baterai yang terhubung ke perangkat.

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

Mengakses detail laporan

Objek BatteryReport menyediakan banyak informasi baterai. Untuk informasi selengkapnya, lihat referensi API untuk propertinya: Status (enumerasi BatteryStatus ), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHours, dan RemainingCapacityInMilliwattHours. Contoh ini menunjukkan beberapa properti laporan baterai yang digunakan oleh aplikasi baterai dasar, yang disediakan nanti dalam topik ini.

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

Meminta pembaruan laporan

Objek Baterai memicu peristiwa ReportUpdated saat mengisi daya, kapasitas, atau status baterai berubah. Ini biasanya terjadi segera untuk perubahan status dan secara berkala untuk semua perubahan lainnya. Contoh ini menunjukkan cara mendaftar pembaruan laporan baterai.

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

Menangani pembaruan laporan

Ketika pembaruan baterai terjadi, peristiwa ReportUpdated meneruskan objek Baterai yang sesuai ke metode penanganan aktivitas. Namun, penanganan aktivitas ini tidak dipanggil dari utas UI. Anda harus menggunakan objek Dispatcher untuk memanggil perubahan UI apa pun, seperti yang ditunjukkan dalam contoh ini.

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

Contoh: aplikasi baterai dasar

Uji API ini dengan membangun aplikasi baterai dasar berikut di Microsoft Visual Studio. Dari halaman mulai Visual Studio, klik Proyek Baru, lalu di bawah templat Visual C# > Windows > Universal , buat aplikasi baru menggunakan templat Aplikasi Kosong .

Selanjutnya, buka file MainPage.xaml dan salin XML berikut ke dalam file ini (menggantikan konten aslinya).

Catatan

Jika aplikasi Anda tidak bernama App1, Anda harus mengganti bagian pertama nama kelas dalam cuplikan berikut dengan namespace aplikasi Anda. Misalnya, jika Anda membuat proyek bernama BasicBatteryApp, ganti x:Class="App1.MainPage" dengan x:Class="BasicBatteryApp.MainPage" dan xmlns:local="using:App1" dengan 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>

Selanjutnya, buka file MainPage.xaml.cs proyek Anda dan ganti kode yang ada dengan yang berikut ini.

Catatan

Jika aplikasi Anda tidak bernama App1, Anda harus mengganti nama namespace dalam contoh berikut dengan nama yang Anda berikan pada proyek Anda. Misalnya, jika Anda membuat proyek bernama BasicBatteryApp, Anda akan mengganti namespace App1 dengan 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();
                    }
                });
            }
        }
    }
}

Tip

Untuk menerima nilai numerik dari objek BatteryReport , debug aplikasi Anda di Komputer Lokal atau Perangkat eksternal. Saat men-debug pada emulator perangkat, objek BatteryReport mengembalikan null ke properti kapasitas dan laju.