「.NET for Androidでバッテリー残量を取得する」の版間の差分
Administrator (トーク | 投稿記録) ページの作成:「 ; 環境 * .NET 8 for Android ; 概要 バッテリーの状態変化を監視するRegisterReceiver関数のreceiver引数をnullにすると現在値が取得できます。 ; コード <source lang="csharp"> readonly IntentFilter filter = new IntentFilter(Intent.ActionBatteryChanged); int GetBatteryLevel(Context context) { // receiverをnullにするとバッテリ状態を単発で習得できます。 var intent = context.RegisterReceiver(receiver…」 |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 1行目: | 1行目: | ||
== 環境 == | |||
* .NET 8 for Android | * .NET 8 for Android | ||
== 単発で取得する == | |||
バッテリーの状態変化を監視するRegisterReceiver関数のreceiver引数をnullにすると現在値が取得できます。 | バッテリーの状態変化を監視するRegisterReceiver関数のreceiver引数をnullにすると現在値が取得できます。 | ||
<source lang="csharp"> | <source lang="csharp"> | ||
readonly IntentFilter filter = new IntentFilter(Intent.ActionBatteryChanged); | readonly IntentFilter filter = new IntentFilter(Intent.ActionBatteryChanged); | ||
| 30行目: | 29行目: | ||
} | } | ||
</source> | </source> | ||
== 状態変化を監視する == | |||
バッテリの状態変化を監視するにはRegisterReceiver関数のreceiver引数にBroadcastReceiverクラスの継承クラスを指定する。 | |||
<source lang="csharp"> | |||
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); | |||
} | |||
} | |||
} | |||
</source> | |||
ググるとJavaやKotlinの実装例がよく出てくるやつだが、C#の場合はAndroidで定番のReceiverだのCallbackだのなどは、継承クラスには処理を書かずに、盲目的にActionに変換した方が扱いやすい。 | |||
<source lang=csharp> | |||
var batteryTracker = new BatteryTracker(this); | |||
batteryTracker.OnBatteryChangedAction = (intent) => { | |||
var level = intent.GetIntExtra(BatteryManager.ExtraLevel, -1), | |||
var scale = intent.GetIntExtra(BatteryManager.ExtraScale, -1), | |||
}; | |||
batteryTracker.Start(); | |||
</source> | |||
[[category: .NET for Android]] | [[category: .NET for Android]] | ||
2024年10月21日 (月) 10:03時点における版
環境
- .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();