.NET for Androidでバッテリー残量を取得する
環境
- .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();