Android StudioでAndroid端末の電流、電圧、ワット数を計測する

Androidのアプリによって消費電力が変わるのか確認したくて実装しようと考えたので、Android Studioで実装してみました。

# 動作環境

* Android studio 4.1.2
* Windows 10 Pro 20H2

# 実装

~~~kotlin:MainActivity

class MainActivity : AppCompatActivity() {
    private val sbuilder = StringBuilder()
    private var batteryStatus: Intent? = null
    private var bManager: BatteryManager? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val ifilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
        batteryStatus = this.registerReceiver(null, ifilter)



        // 以降は Lollipop と機種によるサポートの違いあり
        if (Build.VERSION.SDK_INT >= 21) {
            bManager = this.getSystemService(BATTERY_SERVICE) as BatteryManager
            if (bManager != null) {
                // BatteryCapacityMicroAh
                val battery = bManager!!.getIntProperty(
                        BatteryManager.BATTERY_PROPERTY_CURRENT_NOW )
                sbuilder.append("battery: ")
                sbuilder.append((battery / 1000).toString())
                sbuilder.append(" mA\n")

                // Voltage
                val bv = batteryStatus!!.getIntExtra(
                        BatteryManager.EXTRA_VOLTAGE, -1)
                sbuilder.append("Voltage: ")
                sbuilder.append((bv.toFloat() / 1000).toString())
                sbuilder.append(" [v]\n\n")
                var A = battery.toFloat() / 1000000
                var V = bv.toFloat() / 1000
                var W = A * V
                sbuilder.append("WAT: ")
                sbuilder.append(W.toString())
                sbuilder.append(" [W]\n\n")

            }
        }
        val textView = findViewById<TextView>(R.id.text_view)
        textView.text = sbuilder
    }
}
~~~
~~~xml:MainActivity
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
~~~

# 解説
### Androidのバッテリー情報を持ってくる
* IntentFilterはアプリの根幹の情報を取ってくるモジュールで引数のIntent.ACTION_BATTERY_CHANGEDはバッテリー情報を持ってくるように指定する

~~~kotlin:MainActivity
 val ifilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
~~~
### レシーバーを登録する

* MainActivityが破棄されない限り、ブロードキャストを受信する
  * ブロードキャストは、対象となるイベントが発生したときに送信されます。たとえば、システムの起動、デバイスの充電の開始など、さまざまなシステム イベントが発生したときに、Android システムがブロードキャストを送信します。

~~~kotlin:MainActivity
batteryStatus = this.registerReceiver(null, ifilter)
~~~
### 計測する

* this.getSystemServiceはAndroid端末のバージョンによってサービスが変わってくるため、SDKのバージョンが21以上であるか判定する（SDKバージョン２１＝Android５）
* this.getSystemServiceはバッテリー状態を管理するハンドラ

~~~kotlin:MainActivity
 if (Build.VERSION.SDK_INT >= 21) {
            bManager = this. this.getSystemService(BATTERY_SERVICE) as BatteryManager
・・・
}
~~~

* 消費電力をマイクロアンペアの単位で取得する。バッテリーの値は、充電される電力と消費電力の差を表示している
  * 充電時は、充電電力　ー　消費電力と計算され、充電電力の方が大きいためプラスで表示される
  * バッテリー駆動時、消費電力だけ表示されるため、マイナスで表示される

~~~kotlin:MainActivity
val battery = bManager!!.getIntProperty(
                        BatteryManager.BATTERY_PROPERTY_CURRENT_NOW )
~~~

* BatteryManager.EXTRA_VOLTAGEで電圧を取得する

~~~kotlin:MainActivity.kt
val bv = batteryStatus!!.getIntExtra(
                        BatteryManager.EXTRA_VOLTAGE, -1)
~~~

* ワット数を計算する
　　* ワット数は電流✖️電圧で計算できる
~~~kt:MainActivity.kt
var A = battery.toFloat() / 1000000
                var V = bv.toFloat() / 1000
                var W = A * V
~~~

# 完成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/957268/5c92dc6e-2ee3-9991-58cd-3f23cf465ca2.png" width="300">

# 参考
https://hegtel.com/denatsu-denryu.html
https://source.android.google.cn/devices/tech/power/device?hl=ja
https://akira-watson.com/android/batterymanager.html