Smile Engineering blog ( スマイルエンジニアリング・ブログ )

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

Androidで熱中症対策

2012-07-29 15:58:32 | Android
Android 4.0 から新しいセンサータイプが追加された。
温度(Sensor.TYPE_AMBIENT_TEMPERATURE)
湿度(Sensor.TYPE_RELATIVE_HUMIDITY)
である。
#温度はSensor.TYPE_TEMPERATUREとして以前からあったが、廃止され上記になった。

これなら熱中症危険度判定アプリなんてものができるではないかと思い、
さっそく作ってみようと思った。
が、よくよく考えてみると、実機はないし、エミュレータでは温度や湿度を感知できない…
作ったところで動作確認ができないことに気づいた。

そこで今回はSensorSimulatorというものを使って、シミュレータ上で温度を変化させることで動かしてみようと思う。
#残念なことにこのシミュレータに湿度がないため、危険度は温度だけで(湿度60%固定として)判定することにする。

1.SensorSimulatorのダウンロードと設定

まずは下記から sensorsimulator-2.0-rc1.zip をダウンロード。
http://code.google.com/p/openintents/downloads/list

適当な場所に展開するだけでOK。
操作画面は
bin/sensorsimulator-2.0-rc1.jar
をたたくと起動する。


見ての通り、このツールで様々なセンサーのシミュレーションが行える。
左上ペインの、スマホの構造図みたいなヤツをつかんでグルグルと動かすことでシェイク動作のシミュレーションなんかもできてしまう素敵なツールだ。
その他、GPSやバッテリー残量のシミュレーションもできるようだ。
#ぜひ湿度にも対応していただきたい。

今回は温度を使用するので、操作画面でtemperatureを選択しておく。


これとAndroidのエミュレータを連動させるには、まず
bin/SensorSimulatorSettings-2.0-rc1.apk
をエミュレータにインストールする。

インストールした Sensor Simulator Settings アプリを起動し、IPアドレスを設定する。
#IPアドレスは先ほどの操作画面の左下ペインに表示されている。




TestingタブにてConnectボタンを押下。
操作画面にてグルグルと動かすことで、エミュレータと連動していることを確認できる。




Connectのままにしておくために、バックボタンでなくホームボタンでホーム画面に戻っておく。

2.アプリの作成

シミュレータを使うので、ソースもシミュレータ用にしなければならない。
が、それほど難しくはない。
使用するクラスを下記のように変え、使用方法を若干変えるだけである。

 android.hardware.Sensor
  →org.openintents.sensorsimulator.hardware.Sensor
 android.hardware.SensorEvent
  →org.openintents.sensorsimulator.hardware.SensorEvent
 android.hardware.SensorEventListener
  →org.openintents.sensorsimulator.hardware.SensorEventListener
 android.hardware.SensorManager
  →org.openintents.sensorsimulator.hardware.SensorManagerSimulator

上記クラスは、1にてダウンロード展開したディレクトリ内
lib/sensorsimulator-lib-2.0-rc1.jar
にあるので、Androidプロジェクトのlibsフォルダ内に追加する。

また、インターネットも使うので、AndroidManifest.xmlに
<uses-permission android:name="android.permission.INTERNET"/>
を追加する。

では早速実装してみる。
Androidのセンサーを利用する際の大まかな流れは以下の通り。

 1.SensorManagerを取得
 2.リスナーの登録
 3.リスナーの実装
 4.リスナーの登録解除

2.1 SensorManagerを取得

SensorManagerは、様々なセンサーを管理してくれるクラスだ。
センサーの種類を指定するだけで、そのセンサー独自の制御はプログラマが意識することなくすべてAndroidがやってくれる。
センサーを使ったアプリを作るには、まずはこれを取得することから始まる。

今回はシミュレータ用なのでSensorManagerSimulatorを取得する。
#ここはSensorManagerとは取得方法が少し違う。

2.2 リスナーの登録

イベント(温度の変化)が起こっても、それに反応して呼ばれるメソッドがなければ何も処理できない。
イベントが発生したときに呼ばれるリスナーというものを登録する。


第一引数には登録するリスナークラス、
第二引数にはセンサーの種類、
第三引数にはイベントの取得頻度を指定する。

リスナークラスは、SensorEventListenerを実装したクラスを指定する。
センサーの種類は、シミュレータ用のSensor.TYPE_TEMPERATUREを指定する。
#本当はSensor.TYPE_AMBIENT_TEMPERATUREを指定する。

イベントの取得頻度にはいくつかあるが、
今回はSensorManager.SENSOR_DELAY_UI程度で十分だと思うので、これを指定する。
#ここはSensorManagerでもSensorManagerSimulatorでも同じ値なので、どちらでも問題ない。

2.3 リスナーの実装

SensorEventListenerを実装するクラスでは、下記メソッドを実装する必要がある。
 (1) public void onAccuracyChanged(Sensor sensor, int accuracy)
 (2) public void onSensorChanged(SensorEvent event)

(1)はセンサーの精度が変更したときに呼ばれるメソッドだが、今回は使わないため未実装とする。
(2)が、センサーの値が変更したときに呼ばれるメソッドなので、この中で熱中症危険度判定の実装を行う。


本当はandroid.hardware.SensorEvent.timestampでイベント発生時間が取れるのだが、
org.openintents.sensorsimulator.hardware.SensorEvent
にはそれがないため、ここではtimeを取得して表示することにする。

また、危険度判定は本来、温度と湿度から暑さ指数(WBGT値)を出して行うようだが、
http://www.mhlw.go.jp/bunya/roudoukijun/anzeneisei33/dl/03.pdf
今回は湿度60%固定ということなので、上記表からだいたい
WBGT値 = 温度 - 3 ~ 4
として判定している。
#上記表の"注意"だと分かりにくいため、本アプリでは"ほぼ安全"とした。

2.4 リスナーの登録解除

不要になったタイミングでリスナーを解除する。
#今回はonStop()のタイミングで解除することにする。

3.シミュレーションしてみる

さっそくアプリを実行したいが、このままではおそらくandroid.os.NetworkOnMainThreadExceptionが発生するだろう。
Android3.0以降は、UIスレッドでネットワーク処理を行うと同例外がスローされるようなのだ。
本来は別スレッドを立てるべきなのだが、今回はあくまでサンプルということでとりあえず下記対応にて例外を抑制することにした。


以下、アプリの実行画面である。
シミュレータで温度を上げていくと、ドロイド君がどんどん赤くなって危険度が増していくのがわかる。


















これだけだと実用性はあまりないが、
SensorSimulatorやセンサーアプリの作り方の参考になれば幸いである。
今度は湿度感知+水分補給記録機能&アラート機能なんかもつけてみたら
使えるアプリになりそうだ。

株式会社ジェイエスピー
システム部
原 育子


monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業