Androidのアプリによって消費電力が変わるのか確認したくて実装しようと考えたので、Android Studioで実装してみました。
動作環境
- Android studio 4.1.2
- Windows 10 Pro 20H2
実装
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
}
}
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はバッテリー情報を持ってくるように指定する
MainActivity
val ifilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
レシーバーを登録する
- MainActivityが破棄されない限り、ブロードキャストを受信する
- ブロードキャストは、対象となるイベントが発生したときに送信されます。たとえば、システムの起動、デバイスの充電の開始など、さまざまなシステム イベントが発生したときに、Android システムがブロードキャストを送信します。
MainActivity
batteryStatus = this.registerReceiver(null, ifilter)
計測する
- this.getSystemServiceはAndroid端末のバージョンによってサービスが変わってくるため、SDKのバージョンが21以上であるか判定する(SDKバージョン21=Android5)
- this.getSystemServiceはバッテリー状態を管理するハンドラ
MainActivity
if (Build.VERSION.SDK_INT >= 21) {
bManager = this. this.getSystemService(BATTERY_SERVICE) as BatteryManager
・・・
}
- 消費電力をマイクロアンペアの単位で取得する。バッテリーの値は、充電される電力と消費電力の差を表示している
- 充電時は、充電電力 ー 消費電力と計算され、充電電力の方が大きいためプラスで表示される
- バッテリー駆動時、消費電力だけ表示されるため、マイナスで表示される
MainActivity
val battery = bManager!!.getIntProperty(
BatteryManager.BATTERY_PROPERTY_CURRENT_NOW )
- BatteryManager.EXTRA_VOLTAGEで電圧を取得する
MainActivity.kt
val bv = batteryStatus!!.getIntExtra(
BatteryManager.EXTRA_VOLTAGE, -1)
- ワット数を計算する
* ワット数は電流✖️電圧で計算できる
MainActivity.kt
var A = battery.toFloat() / 1000000
var V = bv.toFloat() / 1000
var W = A * V
完成

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