Android(X06HT Desire) 搭載センサーの値を取得してみる
実機を使ってデバッグすることを覚えたので、Desire に搭載されているセンサーの値を取得してみよう。
http://developer.android.com/reference/android/hardware/SensorEvent.html
SenserEvent API の座標系
OpenGLの座標系と同じであり、一般のコンピューター上のスクリーン座標(左上が原点)とは異なる。
3軸 加速度センサー(3-axis Accelerometer)
m/s2(メートル毎秒毎秒)で、加速度を表す。
- X軸加速度
- Y軸加速度
- Z軸加速度
- 水平なテーブルに端末を置いて、左側を右に向けて押した場合、X軸加速度は、正の値になる。
- 水平なテーブルに端末を置いた場合、加速度の値は、端末の加速度(0 m/s^2) 引く、重力(-9.81 m/s^2)で、 +9.81 となる。
- 水平なテーブルに端末を置いて、空に向けて A m/s^2 の加速度をかけた場合、A + 9.81 となる。
3軸 磁界センサー(3-axis Magnetic field sensor)
磁界センサーは、いろいろな用途に利用できるようだが、自分にはさっぱり理解できません。
μT(マイクロテスラ)という単位で電磁波をはかるらしい。
某ピップエレキバンの類似商品が、うちにあり、パッケージを見ると 「100マイクロテスラ」 とうたっている。
Desire の背面の左下あたりに近づけると、確かに 100マイクロテスラ を超える値を検知!
某エレキバンの真偽を確かめるのには使えそうだ。
傾きセンサー(Orientation sensor)
- 方位 ・・・ 0=北, 90=東, 180=南, 270=西 として、0 ~ 359 の角度
- ピッチ(Pitch) ・・・ X軸にそって、-180 ~ 180 まで回転。Z軸が、Y軸に向かう場合、正の値。
- ロール(Roll) ・・・ Y軸にそって、 -90 ~ 90 まで回転。X軸が、Z軸に向かう場合、正の値。
近接センサー(Proximity sensor)
物体が近づいたら距離を cm で検知する。
ただし、上記に対応しておらず、「近い」「遠い」のいずれかで計測するものもある。
Desire では、近い 0 、遠い 1 と計測されるようだ。
輝度センサー(Light sensor)
明るさをルクス(lux)で計測
上記のソースコード。
package info.typea.sensorlist;
package info.typea.sensorlist;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class SensorListActivity extends ListActivity {
private final static String ACTIVE_SENSOR = "ActiveSensor";
private SensorManager sensorManager = null;
private List<SensorItem> sensorItems;
private TextView txtResult = null;
private int activeSensorType = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
sensorItems = new ArrayList<SensorItem>();
for (Sensor sensor : sensors) {
SensorItem sensorItem = new SensorItem();
sensorItem.setSensorName(sensor.getName());
sensorItem.setSensorType(sensor.getType());
sensorItems.add(sensorItem);
}
ArrayAdapter<SensorItem> lstAdapter
= new ArrayAdapter<SensorItem>(this, R.layout.sensor_row, sensorItems);
setListAdapter(lstAdapter);
txtResult = (TextView) findViewById(R.id.txt_result);
}
@Override
protected void onResume() {
super.onResume();
// プリファレンスに保存されたセンサーを復帰
SharedPreferences pref = getPreferences(MODE_PRIVATE);
int sensorType = pref.getInt(ACTIVE_SENSOR, 0);
startSensorTrace(sensorType);
}
@Override
protected void onPause() {
// 選択されたセンサーをプリファレンスに待避
if (this.activeSensorType != 0) {
SharedPreferences pref = getPreferences(MODE_PRIVATE);
Editor editor = pref.edit();
editor.putInt(ACTIVE_SENSOR, this.activeSensorType);
editor.commit();
}
super.onPause();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
txtResult.setText("");
// 選択されたセンサーのリスニングを行う
int sensorType = ((SensorItem)l.getAdapter().getItem(position)).getSensorType();
startSensorTrace(sensorType);
}
/**
* センサータイプを指定してリスナーを登録
* 指定されなかったセンサーのリスナーの登録解除
* @param sensorType
*/
private void startSensorTrace(int sensorType) {
ListAdapter lstAdapter = this.getListAdapter();
for (int i=0; i<lstAdapter.getCount(); i++) {
SensorItem sensorItem = (SensorItem)lstAdapter.getItem(i);
if (sensorItem.getSensorType() == sensorType) {
Sensor sensor = sensorManager.getDefaultSensor(sensorItem.getSensorType());
// センサーリスニングの登録
sensorManager.registerListener(
sensorItem.listener,sensor, SensorManager.SENSOR_DELAY_NORMAL);
this.activeSensorType = sensorType;
} else {
// センサーリスニングの登録解除
sensorManager.unregisterListener(sensorItem.listener);
}
}
}
/**
* 加速度センサー
*/
class AccelerometerSensorListner implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@Override
public void onSensorChanged(SensorEvent event) {
String r = String.format(
"--------------------------------\n" +
"3-axis Accelerometer\n"+
"--------------------------------\n" +
"minus Gx on the x-axis : %f\n" +
"minus Gy on the y-axis : %f\n" +
"minus Gz on the z-axis : %f"
,event.values[0]
,event.values[1]
,event.values[2]
);
txtResult.setText(r);
}
}
/**
* 傾きセンサー
* @see SensorManager.getOrientation()
*/
class OrientationSensorListener implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@Override
public void onSensorChanged(SensorEvent event) {
String r = String.format(
"--------------------------------\n" +
"Orientation sensor\n"+
"--------------------------------\n" +
"Azimuth(0=N,90=E,180=S,270=W) : %f\n" +
"Pitch (X axis -180 to 180) : %f\n" +
"Roll (Y axis -90 to 90) : %f"
,event.values[0]
,event.values[1]
,event.values[2]
);
txtResult.setText(r);
}
}
/**
* 磁界センサー
*/
class MagneticFieldSensorListener implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@Override
public void onSensorChanged(SensorEvent event) {
String r = String.format(
"--------------------------------\n" +
"3-axis Magnetic field sensor\n"+
"--------------------------------\n" +
"X axis : %f μT\n" +
"Y axis : %f μT\n" +
"Z axis : %f μT"
,event.values[0]
,event.values[1]
,event.values[2]
);
txtResult.setText(r);
}
}
/**
* 輝度センサー
*/
class LightSensorListener implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
String r = String.format(
"--------------------------------\n" +
"light sensor\n"+
"--------------------------------\n" +
"%f lux"
,event.values[0]
);
txtResult.setText(r);
}
}
/**
* 近接センサー
*/
class ProximitySensorListener implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
String r = String.format(
"--------------------------------\n" +
"proximity sonsor\n"+
"--------------------------------\n" +
"%f cm"
,event.values[0]
);
txtResult.setText(r);
}
}
/**
* @see http://developer.android.com/reference/android/hardware/SensorEvent.html
*/
class SensorItem {
private int sensorType;
private String sensorName;
public SensorEventListener listener;
public int getSensorType() {
return sensorType;
}
/**
* センサーごとにリスナーを生成
* @param sensorType
*/
public void setSensorType(int sensorType) {
this.sensorType = sensorType;
switch(this.sensorType) {
case Sensor.TYPE_ACCELEROMETER:
this.listener = new AccelerometerSensorListner();
break;
case Sensor.TYPE_ORIENTATION:
this.listener = new OrientationSensorListener();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
this.listener = new MagneticFieldSensorListener();
break;
case Sensor.TYPE_LIGHT:
this.listener = new LightSensorListener();
break;
case Sensor.TYPE_PROXIMITY:
this.listener = new ProximitySensorListener();
break;
default:
this.listener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
txtResult.setText("No Sensor Listener.");
}
};
break;
}
}
public String getSensorName() {
return sensorName;
}
public void setSensorName(String sensorName) {
this.sensorName = sensorName;
}
@Override
public String toString() {
return getSensorName();
}
}
}
