読者です 読者をやめる 読者になる 読者になる

ぴよぴよエンジニアの日記

クラウドベンダーに勤める見習いSEの日記です。発言は私自身の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

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

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

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


開発環境



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

f:id:Santea:20160402013822p:plain

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



f:id:Santea:20160402020621p:plain


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

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で対応可能.

以上です.