Androidへの道 vol.6 「センサーを動かしてみる -- 照度センサー」

全開までで、アプリを作りそれを動作させることができた。(超簡単なプログラムだけど)

今日はもう少し、実践的な?プログラムを動かしてみたいと思う。

さて、『Androidへの道 vol.2 「センサーインターフェース」』でも紹介したが、Androidの端末には多くのセンサーが搭載されている。
僕の大学での卒業研究でも、この搭載センサーを使って何かできないだろうかと思案しているところなのだが、そもそもセンサーを操作できないことには使えない。
いや、むしろセンサーを使ったプログラムを色々と書いてみることで、何かアイデアが浮かんでくるのではないだろうか。

ということで、今日は試しに照度センサー方位センサーから値を取得してみたいと思う。
参考にしたサイトは以下の通り。



センサーを利用する / Getting Started
Androidに搭載されているセンサーの種類、及びそのセンサーを扱うためのクラスの紹介・説明。
サンプルとして、照度センサーの値を取得した簡単なアプリを作っている。



デジモノ狂想曲!: Androidを使って各種センサーの値を取得してみた
方位センサー加速度センサーGPSから取得した生データを画面にリアルタイムに表示するためのプログラムを紹介。



照度センサー

さて、まず手始めに照度センサーを操作してみたいと思う。

そもそも照度センサーとは、スマートフォンのちょうど内部カメラ(画面上についているカメラ)の横についているセンサーで、主に画面の照度の調整に使われるセンサー。
画面の照度設定をオートにしておくと、その場の明るさによって画面の明るさも変化するというもの。
自動的に明るいところでは画面も明るくなり、暗いところでは画面も暗くなるという設定。

ハッキリ言って照度センサーの用途としてはこれくらいしか考えられないのだが、センサー値取得の第一歩として照度センサーを扱いたいと思う。

まずは、上記参考ページにも紹介されているサンプルコード。

public class SensorActivity extends Activity implements SensorEventListener {
    private SensorManager mSensorManager;
    private TextView mTextView;
    private ImageView mImageView;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        // SensorManagerのインスタンスを取得する
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
 
        // ImageViewのインスタンスを取得して、画像を設定する
        mImageView = (ImageView) findViewById(R.id.image);
        mImageView.setImageResource(R.drawable.tb);
 
        // TextViewのインスタンスを取得する
        mTextView = (TextView) findViewById(R.id.value);
 
    }
 
    @Override
    protected void onResume() {
        super.onResume();
 
        // 照度センサーを指定してオブジェクトリストを取得する
        List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_LIGHT);
 
        // 照度センサーがサポートされているか確認してから登録する
        if (sensors.size() > 0) {
            Sensor s = sensors.get(0);
            mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_UI);
        }
    }
 
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // onAccuracyChangedは今回は未使用
    }
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        switch(event.sensor.getType()){
        case Sensor.TYPE_LIGHT:
            // 現在の明るさを取得
            int light_value = (int)(event.values[0]);
 
            // 明るさが200未満のときのセリフ
            if (light_value < 200) {
                mTextView.setText("暗いから眠くなってきたにゃ。");
 
            // 明るさが200以上のときのセリフ
            } else {
                mTextView.setText("明るすぎて眼が痛いにゃ。");
            }
 
            // 明るさから透明度を求める
            int alpha = light_value;
            if (alpha > 255) // 透明度の上限値を255に設定する
                alpha = 255;
 
            // ImageViewに透明度を設定する
            mImageView.setAlpha(alpha);
 
            break;
        }
    }
}