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]));
// }
// }
}
}
あわせて読みたい
- Android1.5であれば、
[Android] Redesigned Sensor Manager APIs(Android1.5) | The type SensorListener is deprecated - adakoda - Androi1.0/1.1であれば、
[Android] センサーマネージャー(SensorManager) - adakoda - 傾きセンサーの3軸をイメージで理解するには、
[Android] センサー(Sensor)のAzimuth/Pitch/Roll - adakoda