JavaでAndroidアプリ Android端末の温度を取得する

夏に差が出る!アプリのバッテリー発熱対策

みなさん、こんにちは!

いつもスマホでツイッターばかり見ているので、 仕事の電話がかかってきたときには、だいたいバッテリー切れ寸前のあらたまです。

さて今日はAndroidアプリ開発での、端末バッテリー温度情報の取得方法についてお話していきます。開発言語はJavaです。

つかう手順

バッテリー温度情報の取得をするためには、次の2つの手順を実行します。

  • ブロードキャストレシーバー(BroadcastReceiver)クラスを作る
  • 作成したブロードキャストレシーバークラスを登録する

ブロードキャストレシーバー

ブロードキャスト(Broadcast)とは、英単語で「放送」の意味です。 「放送」とは、不特定の複数相手に同時に情報を送信することです。 テレビ放送やラジオ放送をイメージするとわかりやすいですね。

Androidの内部では、システム変更状況などが相手を指定しない状態で発信(放送・ブロードキャスト)されています。

このブロードキャストされた情報を受け取るためのクラスが、さきほど出てきたブロードキャストレシーバークラスです。

ブロードキャストインテント

この「ブロードキャストされた情報」のことをブロードキャストインテントと呼びます。

システム全体に影響を及ぼすようなことが起きた時、 Androidが自動でこのブロードキャストインテントを発信するので、 ブロードキャストレシーバークラスでそれを受信する、ということですね。

プロジェクトを作成する

それでは、早速作ってみましょう。
まずは、今回の実験用に新しくプロジェクトを作成します。

Android Studioの「File」メニューの「New」から「New Project」をクリックします。

「Empty Activity」を選択して「Next」をクリックします。

作成するプロジェクトの情報を入力し、「Finish」をクリックすればプロジェクト作成完了です。 プロジェクトの作成については、
【はじめてのAndroidアプリ開発入門】アプリプロジェクトの作成
の方で詳しく説明していますので、良ければご参照くださいね。

ブロードキャストレシーバークラスを作成する

それではひとつめの工程、「ブロードキャストレシーバー(BroadcastReceiver)クラスを作る」から始めていきましょう。

プロジェクトツールウィンドウからアクティビティクラスを開きます。

アクティビティに下記の青色部分を参考にプログラミングしてみてください。

package jp.artm.android.tempaturesensorapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * ブロードキャストレシーバー
     */
    private class MyBroadcastReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent) {
            // この中に情報取得処理を書く
        }
    };
}

ブロードキャストレシーバークラスを登録する

続いてふたつめの工程「ブロードキャストレシーバークラスを登録する」です。

アクティビティに下記の青色部分を参考にプログラミングしてみてください。

package jp.artm.android.tempaturesensorapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;

public class MainActivity extends AppCompatActivity {

    MyBroadcastReceiver broadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        broadcastReceiver = new MyBroadcastReceiver();
        this.registerReceiver(broadcastReceiver , intentFilter);
    }

    // ... 省略 ...

    @Override
    protected void onDestroy() {
        this.unregisterReceiver(broadcastReceiver);
        super.onDestroy();
    }
}

温度情報を取得・表示する

これで温度情報の取得の開発はできました!

あとは取得された内容を確認できるように、画面に表示するようにしておきましょう。

アクティビティに下記の青色部分を参考にプログラミングしてみてください。

package jp.artm.android.tempaturesensorapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // ... 省略 ...

    /**
     * ブロードキャストレシーバー
     */
    private class MyBroadcastReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent) {
            // EXTRA_TEMPERATURE で取得できる温度は x10 されたint型
            float batteryTemp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) / 10.0f;
            // 画面に表示
            TextView textView = findViewById(R.id.text_view);
            textView.setText(batteryTemp + "度");
        }
    };
}

プロジェクトツールウィンドウからレイアウトファイルを開きます。
開いたらTextViewに「text_view」というidを付けておきましょう。

動かしてみる

これですべてのプログラミングが終わりました!
動かして確認してみましょう。

「▶」ボタンをクリックしてアプリを起動します。

無事バッテリーの温度が表示されました!

今日はここまでです、いかがでしたか?

バッテリーの温度が取得できれば、 あまりに高温になっているときは一時的に処理を休むなど、 端末にやさしいアプリを開発することができますね。