배터리 정보 가져오기Get battery information

* * 중요 한 Api * *** Important APIs **

Windows.Devices.Power 네임스페이스에서 API를 사용하여 자세한 배터리 정보를 가져오는 방법을 알아봅니다.Learn how to get detailed battery information using APIs in the Windows.Devices.Power namespace. 배터리 보고서 (BatteryReport)는 배터리 또는 배터리 집계의 요금, 용량 및 상태를 설명 합니다.A battery report (BatteryReport) describes the charge, capacity, and status of a battery or aggregate of batteries. 이 항목에서는 앱이 배터리 보고서를 받고 변경 내용에 대 한 알림 메시지를 표시 하는 방법을 보여 줍니다.This topic demonstrates how your app can get battery reports and be notified of changes. 코드 예제는이 항목의 끝에 나열 된 기본 배터리 앱에서 가져온 것입니다.Code examples are from the basic battery app that's listed at the end of this topic.

집계 배터리 보고서 가져오기Get aggregate battery report

일부 장치에는 두 개 이상의 배터리가 포함 되어 있으며, 각 배터리가 장치의 전체 에너지 용량에 어떻게 기여 하는 지는 항상 명확 하지는 않습니다.Some devices have more than one battery and it's not always obvious how each battery contributes to the overall energy capacity of the device. AggregateBattery 클래스가 제공 되는 위치입니다.This is where the AggregateBattery class comes in. 집계 배터리 는 장치에 연결 된 모든 배터리 컨트롤러를 나타내며 단일 전체 BatteryReport 개체를 제공할 수 있습니다.The aggregate battery represents all battery controllers connected to the device and can provide a single overall BatteryReport object.

참고    배터리 클래스는 실제로 배터리 컨트롤러에 해당 합니다.Note  A Battery class actually corresponds to a battery controller. 장치에 따라 컨트롤러는 실제 배터리에 연결 된 경우에도 장치 엔클로저에 연결 되는 경우도 있습니다.Depending on the device, sometimes the controller is attached to the physical battery and sometimes it's attached to the device enclosure. 따라서 배터리가 없을 때에도 배터리 개체를 만들 수 있습니다.Thus, it's possible to create a battery object even when no batteries are present. 다른 경우에는 배터리 개체가 null일 수 있습니다.Other times, the battery object may be null.

집계 배터리 개체가 있으면 Getreport 를 호출 하 여 해당 BatteryReport를 가져옵니다.Once you have an aggregate battery object, call GetReport to get the corresponding 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);
}

개별 배터리 보고서 가져오기Get individual battery reports

개별 배터리에 대해 BatteryReport 개체를 만들 수도 있습니다.You can also create a BatteryReport object for individual batteries. FindAllAsync 메서드와 함께 getdeviceselector 를 사용 하 여 장치에 연결 된 모든 배터리 컨트롤러를 나타내는 deviceinformation 개체의 컬렉션을 가져옵니다.Use GetDeviceSelector with the FindAllAsync method to obtain a collection of DeviceInformation objects that represent any battery controllers that are connected to the device. 그런 다음 원하는 Deviceinformation 개체의 Id 속성을 사용 하 여 FromIdAsync 메서드를 사용 하 여 해당 배터리 를 만듭니다.Then, using the Id property of the desired DeviceInformation object, create a corresponding Battery with the FromIdAsync method. 마지막으로 Getreport 를 호출 하 여 개별 배터리 보고서를 가져옵니다.Finally, call GetReport to get the individual battery report.

이 예제에서는 장치에 연결 된 모든 배터리에 대 한 배터리 보고서를 만드는 방법을 보여 줍니다.This example shows how to create a battery report for all batteries connected to the device.

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

보고서 세부 정보 액세스Access report details

BatteryReport 개체는 많은 배터리 정보를 제공 합니다.The BatteryReport object provides a lot of battery information. 자세한 내용은 해당 속성에 대 한 API 참조, 상태 ( BatteryStatus 열거형), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHoursRemainingCapacityInMilliwattHours를 참조 하세요.For more info, see the API reference for its properties: Status (a BatteryStatus enumeration), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHours, and RemainingCapacityInMilliwattHours. 이 예제는이 항목의 뒷부분에서 제공 하는 기본 배터리 앱에서 사용 하는 일부 배터리 보고서 속성을 보여 줍니다.This example shows some of the battery report properties used by the basic battery app, that's provided later in this topic.

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

보고서 업데이트 요청Request report updates

배터리 개체는 배터리 청구, 용량 또는 상태가 변경 될 때 reportupdated 이벤트를 트리거합니다.The Battery object triggers the ReportUpdated event when charge, capacity, or status of the battery changes. 일반적으로 상태를 변경 하 고 다른 모든 변경 내용에 대해 주기적으로 발생 합니다.This typically happens immediately for status changes and periodically for all other changes. 이 예제에서는 배터리 보고서 업데이트를 등록 하는 방법을 보여 줍니다.This example shows how to register for battery report updates.

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

보고서 업데이트 처리Handle report updates

배터리 업데이트가 발생 하면 Reportupdated 이벤트는 해당 배터리 개체를 이벤트 처리기 메서드에 전달 합니다.When a battery update occurs, the ReportUpdated event passes the corresponding Battery object to the event handler method. 그러나이 이벤트 처리기는 UI 스레드에서 호출 되지 않습니다.However, this event handler is not called from the UI thread. 이 예제와 같이 디스패처 개체를 사용 하 여 UI 변경을 호출 해야 합니다.You'll need to use the Dispatcher object to invoke any UI changes, as shown in this example.

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

예: 기본 배터리 앱Example: basic battery app

Microsoft Visual Studio에서 다음과 같은 기본 배터리 앱을 빌드하여 이러한 Api를 테스트 합니다.Test out these APIs by building the following basic battery app in Microsoft Visual Studio. Visual Studio 시작 페이지에서 새 프로젝트를 클릭 하 고 Visual c # > Windows > 유니버설 템플릿 아래에서 비어 있는 앱 템플릿을 사용 하 여 새 앱을 만듭니다.From the Visual Studio start page, click New Project, and then under the Visual C# > Windows > Universal templates, create a new app using the Blank App template.

다음으로, mainpage .xaml 파일을 열고 다음 XML을이 파일에 복사 합니다 (원래 내용 바꾸기).Next, open the file MainPage.xaml and copy the following XML into this file (replacing its original contents).

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

앱 이름이 App1이 아닌 경우 이전 코드 조각에서 클래스 이름의 첫 번째 부분을 앱의 네임 스페이스로 바꾸어야 합니다.If your app isn't named App1, you'll need to replace the first part of the class name in the previous snippet with the namespace of your app. 예를 들어 BasicBatteryApp이라는 프로젝트를 만든 경우를 x:Class="App1.MainPage" 로 바꿉니다 x:Class="BasicBatteryApp.MainPage" .For example, if you created a project named BasicBatteryApp, you'd replace x:Class="App1.MainPage" with x:Class="BasicBatteryApp.MainPage". 또한를로 바꾸어야 xmlns:local="using:App1" 합니다 xmlns:local="using:BasicBatteryApp" .You should also replace xmlns:local="using:App1" with xmlns:local="using:BasicBatteryApp".

그런 다음 프로젝트의 MainPage.xaml.cs 파일을 열고 기존 코드를 다음 코드로 바꿉니다.Next, open your project's MainPage.xaml.cs file and replace the existing code with the following.

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

앱 이름이 App1이 아닌 경우에는 이전 예제에서 프로젝트에 지정한 이름으로 네임 스페이스의 이름을 변경 해야 합니다.If your app isn't named App1, you'll need to rename the namespace in the previous example with the name you gave your project. 예를 들어 BasicBatteryApp이라는 프로젝트를 만든 경우 네임 스페이스를 네임 스페이스로 바꿉니다 App1 BasicBatteryApp .For example, if you created a project named BasicBatteryApp, you'd replace namespace App1 with namespace BasicBatteryApp.

마지막으로,이 기본 배터리 앱을 실행 하려면 디버그 메뉴에서 디버깅 시작 을 클릭 하 여 솔루션을 테스트 합니다.Finally, to run this basic battery app: on the Debug menu, click Start Debugging to test the solution.

   BatteryReport 개체에서 숫자 값을 수신 하려면 로컬 컴퓨터 또는 외부 장치 (예: Windows Phone)에서 앱을 디버그 합니다.Tip  To receive numeric values from the BatteryReport object, debug your app on the Local Machine or an external Device (such as a Windows Phone). 장치 에뮬레이터에서 디버그할 때 BatteryReport 개체는 capacity 및 rate 속성에 null 을 반환 합니다.When debugging on a device emulator, the BatteryReport object returns null to the capacity and rate properties.