「.NET for Androidでバッテリー残量を取得する」の版間の差分

ページの作成:「 ; 環境 * .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…」
 
 
(同じ利用者による、間の1版が非表示)
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]]