ソフトウェア開発したい日記

「面白い!」と思った頭の体操や、数学の問題を載せていきます
その他ロードバイクででかけた先の写真や、ソフト開発のメモ等

Androidの加速度センサで遊んでみた

2010年11月22日 20時07分26秒 | ソフト開発日記
加速度センサの機能使ってみたら、意外とすんなり使えました。
ものすごく単純に3軸の加速度センサーの値を
エディットテキストに表示していくだけなので短いソースです。
そしてIS01に投入したら、無事動きました。
ただ、センサー使った開発はエミュレータ上では反応せず、
実際の機器に投入しないと動きがわからないのが面倒(キャプチャの仕方もわかんない)。
まずはエミュレータ上でも仮想的にセンサーを反応させるアプリケーションか、
Android携帯のスクリーンキャプチャ方法を勉強することにします。
そしてそのうち、何か遊べるものや研究に使えるものを作っていくことにします。

今回のソースコードは、SensorEventListenerインターフェースの
onSensorChanged()メソッドとonAccuracyChanged()メソッドについて、
@Overrideアノテーションつけると
「スーパークラスのメソッドをオーバーライドする必要があります」
ってエラーが出る点が納得できませんでした。
とりあえずこれらメソッドのアノテーション消すことで回避しました(逃げました)。
コンパイラが準拠するバージョンによって、アノテーションの仕様に若干差があるという噂も。
もうちょっと調べたり勉強する必要がありそう。
以下、加速度センサーのテスト用ソース。

============================================================================================

package sensor.sensortest;

import java.util.List;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.LinearLayout;

public class SensorTestActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
public EditText edit;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//ActivityクラスのgetSystemServiceでSenserManagerクラスのインスタンスを生成
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
setContentView(R.layout.main);
//エディットテキストの設定
edit = new EditText(this);
edit.setText("初期状態");
//レイアウトの設定
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
layout.addView(edit);
}

@Override
protected void onResume(){
super.onResume();
//getSensorListメソッドで加速度センサーを指定して、Sensorクラスのインスタンスを取得
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
//センサー受信のためのリスナーを登録
//SENSOR_DELAY_NORMALはセンサーが値を取得する間隔を意味する
for(Sensor s : sensors){
sensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL);
}
}

//センサーの値が更新されるたびに呼び出し
public void onSensorChanged(SensorEvent e){
if(e.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
//エディットテキストに、各加速度センサの値を表示
edit.setText("" + e.values[SensorManager.DATA_X]);
edit.append("\n" + e.values[SensorManager.DATA_Y]);
edit.append("\n" + e.values[SensorManager.DATA_Z]);
}
}

//センサーの精度が変更されたとき呼び出し
public void onAccuracyChanged(Sensor sensor, int accuracy){
}

@Override
protected void onStop(){
super.onStop();
sensorManager.unregisterListener(this);
}
}