Plugins for Xamarin の Battery Status を使ってみた

Plugins for Xamarin の Battery Status を使ってみました.

Battery Status はその名の通り,バッテリーの充電量や状態(充電中など)を知ることができるプラグインです.

開発環境

    Windows 10 Home
  • Visual Studio Community 2015
  • Xamarin 4.0.0.1717 (1390b70)
  • Xamarin.Android 6.0.0.35 (d300845)

プラグインのインストール

NuGet でインストールができます.

今回は ver 2.0.0 を用いました.

サンプルコード

using Plugin.Battery;
using Plugin.Battery.Abstractions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Xamarin.Forms;

namespace BatteryStatusSample
{
    public class App : Application
    {
        public App()
        {
            var batteryStatus = new Label { FontSize = 25 };
            var batteryLevel = new Label { FontSize = 25 };
            var batteryChargeType = new Label { FontSize = 25 };
            var batteryIsLow = new Label { FontSize = 25 };

            // バッテリーの各プロパティ
            batteryStatus.Text = "Status: " + CrossBattery.Current.Status.ToString();
            batteryLevel.Text = "Level: " + CrossBattery.Current.RemainingChargePercent;
            batteryChargeType.Text = "ChargeType: " + CrossBattery.Current.PowerSource.ToString();
            batteryIsLow.Text = "IsLow: " + ((CrossBattery.Current.RemainingChargePercent <= 15) ? "YES" : "NO");

            // The root page of your application
            MainPage = new ContentPage
            {
                Content = new StackLayout
                {
                    VerticalOptions = LayoutOptions.Center,
                    Children = {
                        batteryStatus,
                        batteryLevel,
                        batteryChargeType,
                        batteryIsLow
                    }
                }
            };

            // バッテリーの状態変化のイベント
            CrossBattery.Current.BatteryChanged += (sender, args) =>
            {
                batteryStatus.Text = "Status: " + args.Status.ToString();
                batteryLevel.Text = "Level: " + args.RemainingChargePercent;
                batteryChargeType.Text = "ChargeType: " + args.PowerSource.ToString();
                batteryIsLow.Text = "IsLow: " + (args.IsLow ? "YES" : "NO");
            };
        }

        protected override void OnStart()
        {
            // Handle when your app starts
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }
    }
}

バッテリーの状態は以下の3つが取得できます.

  • Status
  • RemainingChargePercent
  • PowerSource

加えて BatteryChanged の args からはもう1つのプロパティが取得できます.

  • IsLow

バッテリーの状態を表す Status プロパティは以下の5つ値を持ちます.

  • Charging
  • Discharging
  • Full
  • NotCharging
  • Unknown

充電量は RemainingChargePercent プロパティから取得でき,値は [0, 100] です.

電力供給減は PowerSource プロパティから取得でき,以下の5つの値を持ちます.

  • Ac
  • Battery
  • Other
  • Usb
  • Wireless

アプリが起動していないときのバッテリーイベントについて

Android の BroadcastReceiver のようにアプリが起動していない状態でもバッテリーのイベントを取得できないかと思ったのですが…

Battery Status 自体が Android の実装で BroadcastReceiver を使っているので,土台無理な話ではないとは思いますが,PCL で実現する範囲ではないということですね.

そうであれば仕方がないので,Battery Status にはあくまでアプリ起動時のバッテリーイベントをハンドルしてもらって,アプリが起動していないときは各 OS で別途ハンドルという形を取りました(Androidのみ).

using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Content;
using Android.Util;
using System.Collections.Generic;

namespace BatteryStatusSample.Droid.Receiver
{
    [BroadcastReceiver(Enabled = true)]
    [IntentFilter(new[] { Intent.ActionPowerConnected })]
    public class PowerConnectReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            // do something ...

            ActivityManager manager = (ActivityManager)context.GetSystemService(Context.ActivityService);
            // deprecated
            var list = manager.GetRunningTasks(1);
            ActivityManager.RunningTaskInfo topTask = list[0];
            ComponentName topActivity = topTask.TopActivity;

            if (!context.PackageName.Equals(topActivity.PackageName))
            {
                Intent intentActivity = new Intent(context, typeof(MainActivity));
                intentActivity.SetFlags(ActivityFlags.NewTask);
                context.StartActivity(intentActivity);
            }
        }
    }
}

BroadcastReceiver を用い,アプリが起動していない場合はアプリを起動するという処理を行っています.

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Intent.ActionPowerConnected })]

この2行だけで BroadcastReceiver を実装でき,Manifest にごちゃごちゃ書かないでいいのは Xamarin のすごく良いところですよね!

まとめ

  • Plugins for Xamarin の Battery Status を使ってみた.
  • 簡単にバッテリーイベントをハンドルできる.
  • 非アプリ起動時のバッテリーイベントは BroadcastReceiver で対応可能.

以上です.