バッテリーの状態を取得する
今回はスマートフォンのバッテリー状態を取得する方法の説明です。
バッテリーの状態はスティッキーインテントなのでブロードキャストレシーバーが無くても取得ができるようになっていますが、バッテリーの状態の変化を常に監視するにはブロードキャストレシーバーを使用してインテントを受信する必要があります。
サンプルコード①(MainActivity.java)
バッテリー情報を得るには「ACTION_BATTERY_CAHNGED」というインテントのフィルターを生成してそのフィルターをレシーバーへ登録します。その後、インテントから各バッテリーの状態を取得しています。
バッテリーの状態は数値で送られてくるので、数値だけでは判別できない「バッテリーの健康状態」「接続状態」「充電状態」は変換用の関数を作って数値から文字列に変換してから表示しています。
public class MainActivity extends AppCompatActivity {
//結果表示用の変数
private String battery_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//レイアウトファイルのセット
setContentView(R.layout.activity_main);
//アクションバーを非表示にする
ActionBar actionBar1 = getSupportActionBar();
actionBar1.hide();
//レイアウトファイルのテキストビューを取得
TextView textView1 = (TextView)findViewById(R.id.battery_info);
//インテントフィルターの生成とレシーバーへの登録
IntentFilter intentFilter1 = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent intent1 = getBaseContext().registerReceiver(null, intentFilter1);
//初期化
battery_info = "";
//残量を取得
int level = intent1.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
battery_info += "残量" + level + "%" + "\n";
//接続状態
int plugged = intent1.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
battery_info += plug(plugged) + "\n";
//健康状態を取得
int health = intent1.getIntExtra(BatteryManager.EXTRA_HEALTH, -1);
battery_info += health(health) + "\n";
//ステータスを取得
int statas = intent1.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
battery_info += stat(statas) + "\n";
//温度を取得
int ondo = intent1.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
battery_info += ondo / 10 + "℃\n";
//電圧を取得
int voltage = intent1.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
battery_info += voltage / 1000 + "V\n";
//結果レポートの出力
textView1.setText(battery_info);
}
//バッテリーの健康状態を返す関数
private String health(int h) {
String return_health = "";
switch (h) {
case BatteryManager.BATTERY_HEALTH_COLD:
return_health = "低温…";
break;
case BatteryManager.BATTERY_HEALTH_DEAD:
return_health = "故障…";
break;
case BatteryManager.BATTERY_HEALTH_GOOD:
return_health = "良好";
break;
case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
return_health = "電圧オーバー";
break;
case BatteryManager.BATTERY_HEALTH_OVERHEAT:
return_health = "オーバーヒート";
break;
case BatteryManager.BATTERY_HEALTH_UNKNOWN:
return_health = "状態不明";
break;
case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
return_health = "未確認エラー";
break;
}
//バッテリーの健康状態を返す
return return_health;
}
//接続状態を返す関数
private String plug(int p) {
String return_plug = "";
switch (p) {
case BatteryManager.BATTERY_PLUGGED_AC:
return_plug = "AC接続";
break;
case BatteryManager.BATTERY_PLUGGED_USB:
return_plug = "USB接続";
break;
case BatteryManager.BATTERY_PLUGGED_WIRELESS:
return_plug = "ワイヤレス接続";
break;
default:
return_plug = "未接続";
}
//接続状態を返す
return return_plug;
}
//充電状態を返す関数
private String stat(int s) {
String return_status = "";
switch (s) {
case BatteryManager.BATTERY_STATUS_CHARGING:
return_status = "充電中";
break;
case BatteryManager.BATTERY_STATUS_FULL:
return_status = "充電完了";
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
return_status = "放電";
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
return_status = "未充電";
break;
case BatteryManager.BATTERY_STATUS_UNKNOWN:
return_status = "状態不明";
break;
}
//充電ステータスを返す
return return_status;
}
}
サンプルコード②(activity_main.xml)
レイアウトは画面の中央にテキストビューがあるだけのシンプルな構造です。
<TextView
android:id="@+id/battery_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Battery"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
実行結果
バッテリー残量、接続状態、健康状態、充電状態、温度、電圧の6項目の状態を取得して表示することができました。

備考
バッテリー状態の取得に関するより詳しい説明については「Android Developers」を参照ください。
https://developer.android.com/training/monitoring-device-state/battery-monitoring?hl=ja
END