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

提供:MonoBook
ページの作成:「 ; 環境 * .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行目:




; 環境
== 環境 ==
* .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();