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(); } } }