.NET for Androidでバッテリー残量を取得する

提供:MonoBook


環境[編集 | ソースを編集]

  • .NET 8 for Android

単発で取得する[編集 | ソースを編集]

バッテリーの状態変化を監視するRegisterReceiver関数のreceiver引数をnullにすると現在値が取得できます。

readonly IntentFilter filter = new IntentFilter(Intent.ActionBatteryChanged);

int GetBatteryLevel(Context context) 
{
    // receiverをnullにするとバッテリ状態を単発で習得できます。
    var intent = context.RegisterReceiver(receiver: null, filter: filter);

    if (intent != null && intent.Action == Intent.ActionBatteryChanged)
    {
        // 現在値
        var level = intent.GetIntExtra(BatteryManager.ExtraLevel, -1),
        // 最大値(ほとんどの機種は100だけど安心するな)
        var scale = intent.GetIntExtra(BatteryManager.ExtraScale, -1),

        // 残量パーセント
        var percentage = (int)(level / scale * 100f);
        return percentage;
    }
    return -1;
}

状態変化を監視する[編集 | ソースを編集]

バッテリの状態変化を監視するにはRegisterReceiver関数のreceiver引数にBroadcastReceiverクラスの継承クラスを指定する。

public class BatteryTracker : BroadcastReceiver 
{
    readonly IntentFilter _filter = new IntentFilter(Intent.ActionBatteryChanged);
    Context _context;

    public Action<Intent>? OnBatteryChangedAction;

    public BatteryTracker(Context context) 
    {
        _context = context;
    }

    public void Start() 
    {
        // receiverをnullにするとバッテリ状態を単発で習得できます。
        _context.RegisterReceiver(receiver: this, filter: filter);
    }
    public void Stop()
    {
         _context.UnregisterReceiver(this);
    }

    public override void OnReceive(Context? context, Intent? intent)
    {
        if (intent != null && intent.Action == Intent.ActionBatteryChanged)
        {
            OnBatteryChangedAction?.Invoke(intent);
        }
    }
}

ググるとJavaやKotlinの実装例がよく出てくるやつだが、C#の場合はAndroidで定番のReceiverだのCallbackだのは、継承クラスには処理を書かずに、盲目的にActionに変換した方が扱いやすい。

var batteryTracker = new BatteryTracker(this);
batteryTracker.OnBatteryChangedAction = (intent) => {
    var level = intent.GetIntExtra(BatteryManager.ExtraLevel, -1),
    var scale = intent.GetIntExtra(BatteryManager.ExtraScale, -1),
};
batteryTracker.Start();