逆引きAndroid入門 センサー(Sensor)を使用するには

センサー(Sensor)を使用するには

Android SDKでは、以下のような種類のセンサー(Sensor)をサポートしており、
Android1.0/1.1とAndroid1.5でAPIが異なります。


サポートしているセンサーの種類

Android1.5

  • Sensor.TYPE_ACCELEROMETER・・・加速度センサー
  • Sensor.TYPE_MAGNETIC_FIELD・・・地磁気センサー
  • Sensor.TYPE_ORIENTATION・・・傾きセンサー
  • Sensor.TYPE_GYROSCOPE・・・ジャイロセンサー
  • Sensor.TYPE_LIGHT・・・明るさセンサー
  • Sensor.TYPE_PRESSURE・・・圧力センサー
  • Sensor.TYPE_TEMPERATURE・・・温度センサー
  • Sensor.TYPE_PROXIMITY・・・近傍センサー


Android1.0/1.1

  • SensorManager.SENSOR_ORIENTATION・・・傾きセンサー
  • SensorManager.SENSOR_ACCELEROMETER・・・加速度センサー
  • SensorManager.SENSOR_TEMPERATURE・・・温度センサー
  • SensorManager.SENSOR_MAGNETIC_FIELD・・・地磁気センサー
  • SensorManager.SENSOR_LIGHT・・・明るさセンサー
  • SensorManager.SENSOR_PROXIMITY・・・近傍センサー
  • SensorManager.SENSOR_TRICORDER・・・トリコーダーセンサー
  • SensorManager.SENSOR_ORIENTATION_RAW・・・傾きセンサー(フィルターなし)

 

※上記は、定数の順に書いているので読みづらいですが、簡単にまとめると、
Android1.0/1.1/1.5の両方に定義されているのは、加速度、地磁気、傾き、明るさ、温度、近傍センサー、
Android1.5にしか定義されていないのは、ジャイロ、圧力センサー、
Android1.0/1.1にしか定義されていないのは、トリコーダー、傾きセンサー(フィルターなし)

 

センサーの使い方

センサーを使用するには、以下のような手順が必要です。

1.SensorManagerインスタンスを取得する
2.SensorManagerインスタンスに対し、センサーを受信するためのリスナーを登録する
3.受信したセンサーに応答する

 

1.SensorManagerインスタンスを取得する

SensorManagerは、android.hardwareパッケージに含まれていますが、
SensorManagerのインスタンスは、newで作成するのでなく、
ActivityクラスのメソッドにあるgetSystemService(SENSOR_SERVICE)を呼び出すことで、
SensorManagerのインスタンスを取得します。

 

2.SensorManagerインスタンスに対し、センサーを受信するためのリスナーを登録する

センサーを受信するためのリスナークラスとしては、
Android1.5では、SensorEventListener、
Android1.0/1.1では、SensorListener
が用意されています。

これらのリスナーを登録するには、SensorManagerのインスタンスに対し、registerListener()を呼び出します。

Android1.5の場合、
第1引数に、受信するリスナーのインスタンス、
第2引数に、受信したいセンサータイプのリスト(List<Sensor>)
第3引数に、受信したい頻度

Android1.0/1.1の場合、
第1引数に、受信するリスナーのインスタンス、
第2引数に、受信したいセンサー種類と受信したい頻度をビットフィールド

で指定します。 

ちなみに、デバイスによって使用できるセンサーが異なりますので、
お作法として、使用する前に、使用できるかどうか確認しておいた方がよいでしょう。

指定したセンサーが使用できるかどうかは、

Android1.5の場合、
SensorMangerクラスのメソッドにあるgetSensorList()の戻り値のリストに含まれるSensor、

Android1.0/1.1の場合、
SensorMangerクラスのメソッドにあるgetSensors()の戻り値のビットフィールド、

を調べることが判定できます。

 

3.受信したセンサーに応答する

2で登録したセンサーを受信するためのリスナーが必ず実装すべきメソッドとして、
onAccuracyChanged()、onSensorChanged()がありますので、
それらを実装し、必要な処理を行います。

 

具体的なソースコードは、以下のとおりです。

package com.adakoda.sensortest;

import java.util.List;

import android.app.Activity;
import android.hardware.Sensor;    // 1.5
import android.hardware.SensorEvent;    // 1.5
import android.hardware.SensorEventListener;    // 1.5
//import android.hardware.SensorListener; // 1.1
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;

public class SensorTestActivity extends Activity
    implements SensorEventListener { // 1.5
//    implements SensorListener { // 1.1
    
    private boolean mRegisteredSensor;
    private SensorManager mSensorManager;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mRegisteredSensor = false;
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        
        // 1.5
        {
            List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
            
            if (sensors.size() > 0) {
                Sensor sensor = sensors.get(0);
                mRegisteredSensor = mSensorManager.registerListener(this,
                    sensor,
                    SensorManager.SENSOR_DELAY_FASTEST);
                mRegisteredSensor = true;
            }
        }
        
//        // 1.1
//        {
//            int sensors = mSensorManager.getSensors();
//            if ((sensors | SensorManager.SENSOR_ORIENTATION) != 0) {
//                mRegisteredSensor = mSensorManager.registerListener(this,
//                        SensorManager.SENSOR_ORIENTATION,
//                        SensorManager.SENSOR_DELAY_FASTEST);
//            }
//        }
    }

    @Override
    protected void onPause() {
        if (mRegisteredSensor) {
            mSensorManager.unregisterListener(this);
            mRegisteredSensor = false;
        }
        
        super.onPause();
    }
    
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) { // 1.5
//    public void onAccuracyChanged(int sensor, int accuracy) { // 1.1
    }

    @Override
    public void onSensorChanged(SensorEvent event) { // 1.5
//    public void onSensorChanged(int sensor, float[] values) { // 1.1

        // 1.5
        {
            if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
                // values[0]:
                // Azimuth, angle between the magnetic north direction and the Y axis,
                // around the Z axis (0 to 359). 0=North, 90=East, 180=South, 270=West
                // values[1]:
                // Pitch, rotation around X axis (-180 to 180),
                // with positive values when the z-axis moves toward the y-axis.
                // values[2]:
                // Roll, rotation around Y axis (-90 to 90),
                // with positive values when the x-axis moves away from the z-axis.             
                Log.v("ORIENTATION",
                    String.valueOf(event.values[0]) + ", " +
                    String.valueOf(event.values[1]) + ", " +
                    String.valueOf(event.values[2]));
            }
        }
        
//        // 1.1
//        {
//            if (sensor == SensorManager.SENSOR_ORIENTATION) {
//                // values[0]:
//                // Azimuth, rotation around the Z axis (0<=azimuth<360).
//                // 0 = North, 90 = East, 180 = South, 270 = West
//                // values[1]:
//                // Pitch, rotation around X axis (-180<=pitch<=180),
//                // with positive values when the z-axis moves toward the y-axis.
//                // values[2]:
//                // Roll, rotation around Y axis (-90<=roll<=90),
//                // with positive values when the z-axis moves toward the x-axis.
//                Log.v("ORIENTATION",
//                    String.valueOf(values[0]) + ", " +
//                    String.valueOf(values[1]) + ", " +
//                    String.valueOf(values[2]));
//            }
//        }
    }
}

 

あわせて読みたい